0

情况:我有一堆文本文件(准确地说是 .csv),大约 20000 个字符编码不同:大多数情况下file -i *.csv给我charset=us-ascii,但有些是utf-16le.

目标:我希望它们都以相同的方式编码,这里是 us-ascii。我想到了一个检查目录中每个文件的编码的单行器,如果是utf-16le,它将其转换为us-ascii.

几天前我才开始学习 bash 编程,所以这个我仍然无法理解。是否有可能,比如在每个文件上运行 file -i(这样做),捕获返回值,检查给出的编码,如果它不是 us-ascii,转换它?

感谢您帮助我了解如何做到这一点!

4

3 回答 3

2

其他解决方案不关心文件的混合,这听起来像是一种解决方案:

for F in *.csv; do
    if [ `file -i "$F" | awk '{print $3;}'` = "charset=utf-16" ]; then
        iconv -f UTF-16 -t US-ASCII "$F" > "u.$F"
    fi
done

更容易的是前几个 (128) 字符中 us-ascii 和 utf-16 的标识 - 因此,如果文件确实是 us-ascii,则转换不会造成任何伤害。

于 2013-05-12T21:15:45.000 回答
1

请尝试以下命令:

iconv -f FROM-ENCODING -t TO-ENCODING *.csv

并用适当的值替换FROM-ENCODING和。TO-ENCODING

您可以使用以下脚本或类似的脚本来满足您的需要。

for file in  *.csv
do
    iconv -f FROM-ENCODING -t TO-ENCODING "$file" > "$file.new"
done

您也可以使用recode命令。

recode FROM-ENCODING..TO-ENCODING file.csv

最后,看看这个在字符集之间转换文本文件的最佳方式?如果您有兴趣了解更多关于iconv和/或recode

于 2013-05-12T21:03:55.197 回答
1

这会将任何非 us-ascii 编码的*.csv文件转换为 us-ascii:

#!/bin/bash
for f in *.csv;do
    charset=`file -i README.md |grep -o 'charset=.*'|cut -d= -f2`
    if [ "$charset" != "us-ascii" ];then
      echo "$f $charset -> us-ascii"
      iconv -f "$charset" -t us-ascii < "$f" > "$f.tmp" \
        && mv "$f.tmp" "$f"
    fi
done
于 2013-05-12T21:17:59.263 回答