删除 unix .csv 文件中所有类型的特殊字符

删除 unix .csv 文件中所有类型的特殊字符

我正在处理来自包含特殊字符的源的大量 CSV 数据流,如下所示:

`÷ Þ Ÿ ³ Ù ÷`

以下是数据集中的示例行,其中包含以下字符:

'÷ÞW' , 'ŸŸŸŸŸŸŸ', '³ŸŸÙ÷'

这是取自不同数据集的另一个示例:

WCP16,2013-06-04 20:06:24,2013-06-04,CPU,PrimeNumberGenerationTest,PASS,USA,H‌​F0SXV1,,,N,9999
WCP06,2013-06-04 20:06:24,2013-06-04,CPU,RegisterTest,PASS,USA,HF0SXV1,,,N,99‌​99
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码人物。有几种不同的工具可能适合您。我首先想到的几个是:

  1. iconv(国际化转换)
  2. tr(翻译)
  3. 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' , '', ''

相关内容