首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用bash脚本将许多txt文件转换为xls文件

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

Stack Overflow用户
提问于 2018-11-20 08:53:57
回答 1查看 778关注 0票数 3

我正在尝试将许多文本文件转换为xls文件。txt文件的样式如下:

代码语言:javascript
复制
"Name";"Login";"Role"
"Max Muster";"Bla102";"user"
"Heidi Held";"Held100";"admin"

我试着使用这个bash脚本:

代码语言:javascript
复制
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

这样,我失去了标题行,我也得到了一个列与许多中国标志,但其余的看上去还可以:

代码语言:javascript
复制
攀挀琀 |  Max Muster |  Bla102   |  user
氀愀猀 |  Heidi Held |  Held100  |  admin

我怎样才能摆脱这些中国标志,保持标题行?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-11-20 12:27:55

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

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

通过这些观察和对现有脚本的重构,尝试

代码语言:javascript
复制
for file in *.txt; do
    awk -F ';' 'BEGIN { OFS="," }
        FNR==1 {
            # Add UTF-8 BOM
            printf "\357\273\277"
            # Generate header line for soffice to discard
            for (i=1; i<=NF; i++) printf "bogus%s", (i==NF ? "\n" : OFS)
        }
        { sub(/\015/, ""); 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包含在正在酝酿中的某个地方。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53389329

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档