我正在处理来自包含特殊字符的源的大量 CSV 数据流,如下所示:
`÷ Þ Ÿ ³ Ù ÷`
以下是数据集中的示例行,其中包含以下字符:
'÷ÞW' , 'ŸŸŸŸŸŸŸ', '³ŸŸÙ÷'
这是取自不同数据集的另一个示例:
WCP16,2013-06-04 20:06:24,2013-06-04,CPU,PrimeNumberGenerationTest,PASS,USA,HF0SXV1,,,N,9999
WCP06,2013-06-04 20:06:24,2013-06-04,CPU,RegisterTest,PASS,USA,HF0SXV1,,,N,9999
WCD42,2013-06-04 20:06:24,2013-06-04,DVDMINUSRW,MainICTest,PASS,USA,HF0SXV1,,,N,9999
WCP09,2013-06-05 01:52:53,2013-06-05,CPU,SSE3Test,PASS,,?÷ÞQ»,,,N,9999
WCP10,2013-06-05 01:52:53,2013-06-05,CPU,SSE4_1Test,PASS,,?÷ÞQ»,,,N,9999
如果我知道会出现什么类型的角色,那么我可以处理它信息学当我读取文件时。
但在我的情况下,我不确定在任何一天我会得到什么类型的数据,因此我的工作失败了。所以我需要一种方法来从数据中删除所有特殊字符。
答案1
我不确定你所说的“特殊字符”到底是什么意思,所以我假设你想摆脱非-ASCII码人物。有几种不同的工具可能适合您。我首先想到的几个是:
iconv
(国际化转换)tr
(翻译)sed
(流编辑器)
iconv
(国际化转换)
这是一个使用的解决方案图标:
iconv -c -f utf-8 -t ascii input_file.csv
旗帜-f
(从) 指定输入格式,-t
标志 (到) 指定输出格式,该-c
标志指示iconv
丢弃无法转换为目标的字符。这会将结果写入标准输出(即写入控制台)。如果您想将结果写入新文件,您可以这样做:
iconv -c -f utf-8 -t ascii input_file.csv -o output_file.csv
然后,如果需要,您可以用新文件替换原始文件:
mv -i output_file.csv input_file.csv
以下是iconv
处理第一个示例字符串的方法:
$ echo "'÷ÞW' , 'ŸŸŸŸŸŸŸ', '³ŸŸÙ÷'" | iconv -c -f utf8 -t ascii
'W' , '', ''
tr
(翻译)
这是一个使用的解决方案tr(翻译)命令:
cat input_file.csv | tr -cd '\000-\177'
该\000-\177
模式使用指定数字范围 0-127八进制符号。这是 ASCII 字符的值范围。该-c
标志指示tr
匹配此范围的补码中的值(即匹配非 ASCII 字符),并且该-d
标志指示tr
执行删除(而不是翻译)。
要将结果写入文件,您可以使用输出重定向:
cat input_file.csv | tr -cd '\000-\177' > output_file.csv
以下是tr
处理第一个示例字符串的方法:
$ echo "'÷ÞW' , 'ŸŸŸŸŸŸŸ', '³ŸŸÙ÷'" | tr -cd '\000-\177'
'W' , '', ''
sed
(流编辑器)
这是一个使用的解决方案sed:
sed 's/[\d128-\d255]//g' input_file.csv
前缀s
指示sed
执行替换,g
后缀指示sed
全局匹配模式(默认情况下仅匹配第一个匹配项),模式[\d128-\d255]
指示sed
匹配十进制值在 128-255 范围内的字符(即非 ASCII 字符),而第二个和第三个正斜杠之间的空字符串告诉sed
用空字符串替换匹配的模式(即删除它们)。
与许多其他程序不同,sed
它可以选择就地更新文件(而不是手动写入不同的文件,然后替换原始文件):
sed -i 's/[\d128-\d255]//g' input_file.csv
以下是sed
处理第一个示例字符串的方法:
$ echo "'÷ÞW' , 'ŸŸŸŸŸŸŸ', '³ŸŸÙ÷'" | sed 's/[\d128-\d255]//g'
'W' , '', ''