使用 bash 脚本将许多 txt 文件转换为 xls 文件
Convert many txt files to xls files with bash script
我正在尝试将许多文本文件转换为 xls 文件。 txt文件的样式如下:
"Name";"Login";"Role"
"Max Muster";"Bla102";"user"
"Heidi Held";"Held100";"admin"
我尝试使用这个 bash 脚本:
for file in *.txt; do
tr ";" "," < "$file" | paste -d, <(seq 1 $(wc < "$file")) - > "${file%.*}.xls"
soffice --headless --convert-to xls:"MS Excel 95" filename.xls "${file%.*}.xls"
done
有了这个,我丢失了 header 行,我也得到了一个有很多中文标志的列,但其余的看起来还不错:
攀挀琀 | Max Muster | Bla102 | user
氀愀猀 | Heidi Held | Held100 | admin
我怎样才能摆脱这些中文标志并保留 header 行?
不幸的是,这个问题没有提供足够的细节来确定到底是什么问题;但我们至少在评论中确定了以下内容。
- 显然,输入文件包含 DOS 回车 returns.
- 显然,
soffice
attempted to read the file as UTF-16,这就是产生本质上随机的汉字的原因。 (字符可以是任何东西;随机 Unicode BMP 字符更有可能出现在 Chinese/Japanese 块中。)
根据这些观察和对现有脚本的重构,尝试
for file in *.txt; do
awk -F ';' 'BEGIN { OFS="," }
FNR==1 {
# Add UTF-8 BOM
printf "737"
# Generate header line for soffice to discard
for (i=1; i<=NF; i++) printf "bogus%s", (i==NF ? "\n" : OFS)
}
{ sub(/5/, ""); print FNR, [=10=] }' "$file" > "${file%.*}.xls"
soffice --headless --convert-to xls:"MS Excel 95" filename.xls "${file%.*}.xls"
done
换句话说,Awk 脚本以分号 (-F ';'
) 分隔每个输入行,并将输出字段分隔符 OFS
设置为逗号。在第一个输出行上,我们添加了一个 BOM 和一个用于 soffice
的合成 header 行,以便在实际输出之前丢弃,以便 header 行在输出中看起来像一个常规数据行. sub
负责删除任何 DOS 回车 return 字符,变量 FNR
是当前输入行的行号。
我不确定 BOM 或伪造的 header 行是否绝对必要,或者您是否需要传递一些额外的选项以使 soffice
将输入视为正确的 UTF -8。也许您还需要在管道中的某处包含 LC_ALL=C
。
我正在尝试将许多文本文件转换为 xls 文件。 txt文件的样式如下:
"Name";"Login";"Role"
"Max Muster";"Bla102";"user"
"Heidi Held";"Held100";"admin"
我尝试使用这个 bash 脚本:
for file in *.txt; do
tr ";" "," < "$file" | paste -d, <(seq 1 $(wc < "$file")) - > "${file%.*}.xls"
soffice --headless --convert-to xls:"MS Excel 95" filename.xls "${file%.*}.xls"
done
有了这个,我丢失了 header 行,我也得到了一个有很多中文标志的列,但其余的看起来还不错:
攀挀琀 | Max Muster | Bla102 | user
氀愀猀 | Heidi Held | Held100 | admin
我怎样才能摆脱这些中文标志并保留 header 行?
不幸的是,这个问题没有提供足够的细节来确定到底是什么问题;但我们至少在评论中确定了以下内容。
- 显然,输入文件包含 DOS 回车 returns.
- 显然,
soffice
attempted to read the file as UTF-16,这就是产生本质上随机的汉字的原因。 (字符可以是任何东西;随机 Unicode BMP 字符更有可能出现在 Chinese/Japanese 块中。)
根据这些观察和对现有脚本的重构,尝试
for file in *.txt; do
awk -F ';' 'BEGIN { OFS="," }
FNR==1 {
# Add UTF-8 BOM
printf "737"
# Generate header line for soffice to discard
for (i=1; i<=NF; i++) printf "bogus%s", (i==NF ? "\n" : OFS)
}
{ sub(/5/, ""); print FNR, [=10=] }' "$file" > "${file%.*}.xls"
soffice --headless --convert-to xls:"MS Excel 95" filename.xls "${file%.*}.xls"
done
换句话说,Awk 脚本以分号 (-F ';'
) 分隔每个输入行,并将输出字段分隔符 OFS
设置为逗号。在第一个输出行上,我们添加了一个 BOM 和一个用于 soffice
的合成 header 行,以便在实际输出之前丢弃,以便 header 行在输出中看起来像一个常规数据行. sub
负责删除任何 DOS 回车 return 字符,变量 FNR
是当前输入行的行号。
我不确定 BOM 或伪造的 header 行是否绝对必要,或者您是否需要传递一些额外的选项以使 soffice
将输入视为正确的 UTF -8。也许您还需要在管道中的某处包含 LC_ALL=C
。