拆分csv文件

问题描述:

我试图创建的Automator 服务搜索的右键单击上下文菜单,可以拆分任何选定的csv文件,而在原来的复制每个文件顶部的标题。拆分csv文件

我现在尝试做的Automator运行this Bash Shell Script

#!/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?? 

这个脚本会同时在每个文件的顶部原标题复制拆分成MY_CSV_FILE.csv新文件,最大50行。新文件的原始名称将附加xaa,xab,xac等。

关于Automator设置,这是我目前正在使用的服务。现在的问题是我无法将Finder中的选定文件传递给Bash脚本。

enter image description here

注意:

  • 服务接收:文件或文件夹Finder.app
  • 将输入传递给Shell脚本:作为参数
  • 我已经从Shell脚本的顶部删除了#!/bin/bash,并将Shell设置为:/bin/bash
  • 我切换MY_CSV_FILE.csv"$f" - 不确定是否正确。

我是否还需要为输入文件和生成的输出文件指定类似"[email protected]"的路径?我之前没有做过这样的事情,所以我对这个变量并不熟悉,并且对于这个问题我不太熟悉。

我该如何做这项工作?我希望生成的文件通过Finder右键菜单显示在与我选择运行服务的文件相同的文件夹中。如果该服务只接受csv文件,情况会更好。

enter image description here

我编辑你的脚本来满足需求

set -e 

for FILE in "[email protected]" 
do 
     #must be a file size bigger than zero with extension csv 
     if test -f ${FILE} && test -s ${FILE} && test ${FILE: -4} == ".csv" ; then 
       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?? 

     fi 
done 

注起源脚本不是那么安全的,如果你在你的目录header.csvdata.csv或匹配glob模式x??任何文件中有这样的文件。执行rm header.csv data.csv x??时,所有这些文件将被删除。

+1

替代解决方案:https://apple.stackexchange.com/a/294966/143075 – Winterflags

使用$ 1,$ 2,$ 3等来访问传递到脚本的参数。如果要将所有参数作为数组引用,请使用$ @。