使用 Automator 服务(Finder 上下文菜单)拆分 csv 文件
Split csv file using Automator Service (Finder Context Menu)
我正在尝试为 Finder 的 [=66] 创建一个 Automator Service =] 上下文菜单可以拆分任何 selected csv 文件,同时在每个文件的顶部复制原始 header。
我目前的尝试是制作 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 行的新文件,同时复制每个文件顶部的原始 header。新文件将在原始名称后附加 xaa
、xab
、xac
等
关于 Automator 设置,这是我目前正在处理的服务。现在的问题是我无法将 Finder 中的选定文件传递给 Bash 脚本。
注意:
- 服务接收:文件或文件夹 在Finder.app.
- 将输入传递给 Shell 脚本:作为参数。
- 我已经从 Shell 脚本的顶部删除了
#!/bin/bash
,并将 Shell 设置为:/bin/bash。
- 我将
MY_CSV_FILE.csv
换成 "$f"
– 不确定是否正确。
是否还需要使用类似 "$@"
的方式为输入文件和生成的输出文件指定路径?我以前没有做过这样的事情,所以我不太熟悉那个变量和"$f"
。
我怎样才能完成这项工作?我希望通过 Finder Right-Click 菜单将生成的文件显示在与 select 到 运行 服务所在的文件相同的文件夹中。如果服务只接受 csv 文件就更好了。
使用 $1、$2、$3 等访问传递到脚本中的参数。如果要将所有参数作为数组引用,请使用 $@.
我编辑你的脚本来满足需求
set -e
for FILE in "$@"
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.csv
data.csv
或任何匹配 glob 模式 x??
的文件中有此类文件,则原始脚本并不那么安全。当rm header.csv data.csv x??
执行时,所有这些文件将被删除。
我正在尝试为 Finder 的 [=66] 创建一个 Automator Service =] 上下文菜单可以拆分任何 selected csv 文件,同时在每个文件的顶部复制原始 header。
我目前的尝试是制作 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 行的新文件,同时复制每个文件顶部的原始 header。新文件将在原始名称后附加 xaa
、xab
、xac
等
关于 Automator 设置,这是我目前正在处理的服务。现在的问题是我无法将 Finder 中的选定文件传递给 Bash 脚本。
注意:
- 服务接收:文件或文件夹 在Finder.app.
- 将输入传递给 Shell 脚本:作为参数。
- 我已经从 Shell 脚本的顶部删除了
#!/bin/bash
,并将 Shell 设置为:/bin/bash。 - 我将
MY_CSV_FILE.csv
换成"$f"
– 不确定是否正确。
是否还需要使用类似 "$@"
的方式为输入文件和生成的输出文件指定路径?我以前没有做过这样的事情,所以我不太熟悉那个变量和"$f"
。
我怎样才能完成这项工作?我希望通过 Finder Right-Click 菜单将生成的文件显示在与 select 到 运行 服务所在的文件相同的文件夹中。如果服务只接受 csv 文件就更好了。
使用 $1、$2、$3 等访问传递到脚本中的参数。如果要将所有参数作为数组引用,请使用 $@.
我编辑你的脚本来满足需求
set -e
for FILE in "$@"
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.csv
data.csv
或任何匹配 glob 模式 x??
的文件中有此类文件,则原始脚本并不那么安全。当rm header.csv data.csv x??
执行时,所有这些文件将被删除。