12

我通过选择导出-> 相关文件从经合组织 http://stats.oecd.org/Index.aspx?datasetcode=CRS1 ('CRS 2013 data.txt') 下载一个文件。我想在 Ubuntu (14.04 LTS) 中使用这个文件。

当我运行时:

dos2unix CRS\ 2013\ data.txt

我懂了:

dos2unix: Binary symbol 0x0004 found at line 1703
dos2unix: Skipping binary file CRS 2013 data.txt

我检查文件的编码:

file --mime-encoding CRS\ 2013\ data.txt

看看:

CRS 2013 data.txt: utf-16le

我愿意:

iconv -l | grep utf-16le

它不返回任何东西,所以我这样做:

iconv -l | grep UTF-16LE

返回:

UTF-16LE//

然后我运行:

iconv --verbose -f UTF-16LE -t UTF-8 CRS\ 2013\ data.txt -o crs_2013_data_temp.txt

并检查:

file --mime-encoding crs_2013_data_temp.txt

看看:

crs_2013_data_temp.txt: utf-8

然后我尝试:

dos2unix crs_2013_data_temp.txt

并得到:

dos2unix: Binary symbol 0x04 found at line 1703
dos2unix: Skipping binary file crs_2013_data_temp.txt

然后我尝试强制它:

dos2unix -f crs_2013_data_temp.txt

它可以工作,即dos2unix 完成转换而无需退出/抱怨,但是当我打开文件时,我看到诸如“FoÄŤa 和„ÅšajniÄŤe”之类的条目。

我的问题是为什么?是因为 BOM 对 dos2unix 不可见吗?因为不见了?我没有做正确的转换吗?如何转换此文件(正确?)以便我可以阅读它。

4

3 回答 3

6

您在文件中看到的那个 0x0004 字符与 BOM 完全没有关系(顺便说一句,这很好)——它是 C0 控制集中的 EOT(传输结束)字符,并且一直在那个代码点因为 7 位 ASCII 是新的热点。(这也是熟悉的 Control-D Unix EOF 序列。)

不幸的是,由于文件是 UTF-16,因此应用到文件以去除回车的预dos2unix方法将无法直接工作。tr不过,因为iconv对您有用,您可以使用它转换为 UTF-8(可以使用tr),然后运行以下tr命令:

tr -d '\r' < crs_2013_data_temp.txt > crs_2013_data_unix.txt

为了使文本文件符合 Unix 行尾约定。但是,您必须密切注意将文件提供给的任何工具,以确保它们不会被 Ctrl-D/EOT 字符卡住;如果他们这样做,您可以使用

tr -d '\004' < crs_2013_data_unix.txt > crs_2013_data_clean.txt

摆脱它。

至于它最初是如何到达那里的?我责怪比利时人让它潜入他们提供给经合组织的数据中,他们可能使用cat - > file或其他类似的令人印象深刻的方式输入了这些数据。此外,一些文本编辑器试图通过隐藏控制字符来提供一些帮助,即使其他工具在看到它们时会退出,因为它们认为您只是在其中塞入了一个伪装成文本的二进制文件一段时间。

于 2015-04-28T16:03:59.977 回答
2

我认为这个命令可以解决您的问题:

cat file | tr -d "\r" > new_file
于 2017-06-23T06:31:56.233 回答
0

我就是这样解决的:

find . -type f -exec sed -i 's/\r//' {} \;
于 2018-07-02T11:41:36.767 回答