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 :

  • Cómo optimizar mi script, un script para abrir una nueva instancia de emacs solo si no hay una instancia presente
  • Verifique el estado de FTP usando AppleScript
  • MacOS Sierra - Automator / Acceso directo para deshabilitar el proxy?
  • Acción de Mail.app Automator / Sript para correos electrónicos sospechosos
  • ¿Cómo puedo hacer que los files invisibles (como el perfil de bash) estén visibles en el buscador?
  • Guarde la session de la Terminal Mac en el file de text
  • #!/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

  • Abre iTunes cuando el iPhone está conectado en una Mac
  • Aplicación Diary para Mac OS X (equivalente a Chronories)
  • La Agenda de Apple está totalmente vacía y se "actualiza" sin parar
  • ¿Puedo get una barra de tareas de la aplicación de Windows XP en OS X?
  • ¿Qué es este ícono de la barra de menu?
  • Calendar.app extremadamente lento en El Capitan. Rebuild el caching? Otra solución?
  • 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).