Dividir file csv usando el service Automator (Menú contextual del buscador)

Intento crear un service de Automator para el menu contextual del button derecho del Finder que puede dividir cualquier file csv seleccionado, mientras copy en el encabezado original en la parte superior de cada file.

Mi bash actual es hacer que Automator ejecute este Bash Shell Script :

  • xxd no encontrado en el modo de recuperación, Mac OS X 10+
  • Ejecutar script en el automatizador (sin terminal)
  • Terminal: desactiva la printing / salida de los commands del keyboard
  • Procesamiento distribuido de Apple Compressor para Autodesk Maya
  • ¿Cómo puedo definir la variable CLASSPATH?
  • Impresión a granel de files PDF
  • #!/bin/bash FILE=$(ls -1 | grep MY_CSV_FILE.csv) NAME=${FILE%%.csv} head -1 $FILE > header.csv tail -n +2 $FILE > data.csv split -l 50 data.csv for a in x?? do cat header.csv $a > $NAME.$a.csv done rm header.csv data.csv x?? 

    Este script dividirá MY_CSV_FILE.csv en files nuevos con un máximo de 50 líneas mientras copy en el encabezado original en la parte superior de cada file. Los nuevos files tendrán el nombre original con xaa , xab , xac , etc.

    Con respecto a la configuration de Automator, este es el service en el que estoy trabajando actualmente. El problema ahora es que no puedo pasar el file seleccionado en Finder al guión Bash.

    enter image description here

    Darse count de:

    • El service recibe: files o carpetas en Finder.app .
    • Pasar input al script de Shell: como arguments .
    • He eliminado #!/bin/bash de la parte superior de la secuencia de commands de Shell y configuré el Shell para: / bin / bash .
    • MY_CSV_FILE.csv por "$f" – no estoy seguro si eso es correcto.

    ¿También necesito especificar la ruta usando algo como "$@" para el file de input y los files de salida resultantes? No he hecho algo así antes, así que no estoy realmente familiarizado con esa variable y "$f" para el caso.

    ¿Cómo podría hacer que esto funcione? Me gustaría que los files resultantes aparezcan en la misma carpeta que el file que seleccioné para ejecutar el Servicio, a través del Menú del Buscador con el button derecho. Sería aún mejor si el Servicio solo aceptara files csv.

    enter image description here

  • ¿La actualización de macOS eliminará Bootcamp Windows?
  • configura el destino youtube-dl en ~ / Descargas
  • ¿Hay alguna herramienta gratuita que permita cortar videos?
  • ¿Cómo puedo agregar nuevas carpetas a Favoritos en la barra lateral del Finder?
  • ¿Cuántas combinaciones de tags hay para un file?
  • ¿Cómo restaurar la carpeta de aplicaciones de Parallel?
  • One Solution collect form web for “Dividir file csv usando el service Automator (Menú contextual del buscador)”

    Escribiría el código de forma un poco diferente, y aquí hay un ejemplo de cómo lo haría:

     #!/bin/bash for f in "$@"; do if [[ -f $f ]]; then d="$(dirname "$f")" n="$(basename "$f")" t='/tmp' if [[ ${n##*.} =~ [cC][sS][vV] ]]; then head -1 "$f" > $t/h.tmp tail -n +2 "$f" | split -a 3 -l 50 - $t/tmp. i=1 for s in $t/tmp.a??; do fn="$d/${n%.*}.$(printf '%03d' $i).csv" if [[ ! -f $fn ]]; then cat $t/h.tmp $s > "$fn" ((i++)) else rm $t/h.tmp $t/tmp.a?? echo "The file '"$fn"' already exists!" exit fi done rm $t/h.tmp $t/tmp.a?? echo '' fi fi done 
    • Como está codificado actualmente, maneja uno o más files pasados ​​al service .
    • Se asegura de que el object sobre el que se actúa es un file , no un directory .
    • Se asegura de que el file tenga una extensión .csv (independientemente del caso de la extensión).
    • Crea los files temporales en: /tmp
    • Comtesting que el nombre de file de salida no existe y, si lo hace, se limpia y sale.
    • Escribe en un file con un nombre de file incrementado numéricamente , por ejemplo, file.001.csv , file.002.csv , etc., en el mismo directory que el / los file (s) que se pasan al service .
    • Elimina los files temporales creados en: /tmp
    • Como está codificado actualmente, maneja files con un recuento de líneas de hasta 49,950 divididos en 50 files de línea, sin contar el encabezado.
      • Tenga en count que no se codifica el event handling errores para el recuento total de líneas del file fuente , sin embargo, podría agregarse fácilmente.
      • O se puede modificar fácilmente para manejar files con un recuento de líneas de hasta 499,950 dividido en 50 files de línea, sin contar el encabezado, cambiando -a 3 del command split a -a 4 y un '%03d' del command printf a '%04d' . ¿También cambiarías $t/tmp.a?? en
        for s in $t/tmp.a??; do for s in $t/tmp.a??; do y rm $t/h.tmp $t/tmp.a?? a: $t/tmp.a???

    También agregaría una acción Ejecutar script de Apple al service , con el siguiente código :

     on run {input, parameters} if (item 1 of input) is "" then display notification "Splitting of the target file(s) is finished!" with title "Split CSV File(s)" else display notification (item 1 of input as string) with title "Split CSV File(s)" end if end run 

    Esto permite que la salida de los commands de echo en la acción Ejecutar script de shell muestre una notificación si ya existe un file de salida o si la split ha finalizado.

    Tenga en count que, si bien la notificación se podía hacer desde dentro de la acción Ejecutar Script de Shell utilizando osascript , no obstante, lo hice de esta manera, ya que era más fácil de codificar.


    Flujo de trabajo del servicio Automator

    Esto se probó en un file llamado file.csv en Finder , que tiene 200 líneas, y las imágenes a continuación muestran lo que se creó mediante la porción de acción Ejecutar script de shell del service Automator cuando se ejecuta en el file .

    Archivo CSV en Finder

    Contenido del archivo CSV dividido en TextEdit

    Loving Apple Products like poisoning (iPhone, iPad, iMac, Macbook, iWatch).