我通过选择导出 - >从OECD 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“这样的条目。
我的问题是为什么?是因为dos2unix看不到BOM吗?因为它丢失了? 我没有完成转换吗? 如何转换此文件(正确?)以便我可以阅读它。
答案 0 :(得分:5)
您在文件中看到的0x0004字符与BOM没有任何关系(顺便说一句,这很好) - 它是来自C0控件集的EOT(传输结束)字符,并且已经存在在那个代码点,因为7位ASCII是新的热点。 (它也是熟悉的Control-D Unix EOF序列。)
不幸的是,将dos2unix
应用于文件以剥离回车符的前tr
方式将不会直接起作用,因为该文件是UTF-16;但是,由于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
或其他类似的平庸手段加入。此外,一些文本编辑通过隐藏控制字符试图有点太有用,即使其他工具在看到它们时会挽救,因为他们认为你只是填充了一段时间内假装是文本的二进制文件。
答案 1 :(得分:1)
我认为这个命令可以解决你的问题:
cat file | tr -d "\r" > new_file
答案 2 :(得分:0)
这就是我解决的方法:
find . -type f -exec sed -i 's/\r//' {} \;