使用bash脚本将许多txt文件转换为xls文件



我正在尝试将许多文本文件转换为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

有了这个,我失去了标题行,我也得到了一个有很多中文标志的列,但其他看起来还可以:

攀挀琀 |  Max Muster |  Bla102   |  user
氀愀猀 |  Heidi Held |  Held100  |  admin

我怎样才能去掉这些中文标志并保留标题行?

不幸的是,这个问题没有提供足够的细节来确定问题的具体内容;但我们在评论中至少确定了以下内容。

  • 显然,输入文件包含DOS回车
  • 显然,soffice试图将文件读取为UTF-16,这就是产生基本上随机的汉字的原因。(字符可以是任何字符;只是更可能的是,一个随机的Unicode BMP字符将出现在中文/日文块中。(

有了这些观察结果和对现有脚本的重构,请尝试

for file in *.txt; do
awk -F ';' 'BEGIN { OFS="," }
FNR==1 {
# Add UTF-8 BOM
printf "357273277"
# Generate header line for soffice to discard
for (i=1; i<=NF; i++) printf "bogus%s", (i==NF ? "n" : OFS)
}
{ sub(/15/, ""); print FNR, $0 }' "$file" > "${file%.*}.xls"
soffice --headless --convert-to xls:"MS Excel 95" filename.xls "${file%.*}.xls"
done

在许多单词中,Awk脚本以分号(-F ';'(分隔每个输入行,并将输出字段分隔符OFS设置为逗号。在第一个输出行上,我们为soffice添加了一个BOM和一个合成标题行,以便在实际输出之前丢弃,这样标题行在输出中看起来像一个常规数据行。sub负责删除任何DOS回车字符,变量FNR是当前输入行的行号。

我不确定BOM或伪标题行是否是严格必要的,或者是否需要传递一些额外的选项来使soffice将输入视为正确的UTF-8。也许您还需要在管道中的某个位置包含LC_ALL=C

最新更新