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

dee*_*puu 4 special-characters escape-characters

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

`÷ Þ Ÿ ³ Ù ÷`
Run Code Online (Sandbox Code Playgroud)

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

'÷ÞW' , 'ŸŸŸŸŸŸŸ', '³ŸŸÙ÷'
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

如果我知道期望什么类型的字符,那么我可以在读取文件时在Informatica 中处理它。

但在我的情况下,我不确定在任何一天我会得到什么类型的数据,因此我的工作失败了。所以我需要一种方法来从数据中删除所有特殊字符。

iga*_*gal 8

我不确定您所说的“特殊字符”到底是什么意思,所以我假设您想去掉非ASCII字符。有几种不同的工具可能适合您。我想到的前几个是:

  1. iconv (国际化转换)
  2. tr (翻译)
  3. sed (流编辑器)

iconv (国际化转换)

这是使用iconv的解决方案:

iconv -c -f utf-8 -t ascii input_file.csv
Run Code Online (Sandbox Code Playgroud)

-f(标志)指定的输入格式,所述-t标志()指定的输出格式,并且将-c标志告诉iconv丢弃字符不能被转换为目标。这会将结果写入标准输出(即您的控制台)。如果要将结果写入新文件,则可以执行以下操作:

iconv -c -f utf-8 -t ascii input_file.csv -o output_file.csv
Run Code Online (Sandbox Code Playgroud)

然后,如果需要,您可以用新文件替换原始文件:

mv -i output_file.csv input_file.csv
Run Code Online (Sandbox Code Playgroud)

以下是如何iconv处理您的第一个示例字符串:

$ echo "'÷ÞW' , 'ŸŸŸŸŸŸŸ', '³ŸŸÙ÷'" | iconv -c -f utf8 -t ascii
'W' , '', ''
Run Code Online (Sandbox Code Playgroud)

tr (翻译)

这是使用tr (translate)命令的解决方案:

cat input_file.csv | tr -cd '\000-\177'
Run Code Online (Sandbox Code Playgroud)

\000-\177模式使用八进制表示法指定数字范围 0-127 。这是 ASCII 字符的值范围。该-c标志告诉tr在此范围的互补匹配值(即匹配非ASCII字符)和-d标志告诉tr执行删除(而不是翻译)。

要将结果写入文件,您将使用输出重定向

cat input_file.csv | tr -cd '\000-\177' > output_file.csv
Run Code Online (Sandbox Code Playgroud)

以下是如何tr处理您的第一个示例字符串:

$ echo "'÷ÞW' , 'ŸŸŸŸŸŸŸ', '³ŸŸÙ÷'" | tr -cd '\000-\177'
'W' , '', ''
Run Code Online (Sandbox Code Playgroud)

sed (流编辑器)

这是使用sed的解决方案:

sed 's/[\d128-\d255]//g' input_file.csv
Run Code Online (Sandbox Code Playgroud)

s前缀告诉sed执行替换,所述g后缀告诉sed全局匹配的模式(默认情况下仅第一次出现的匹配),则图案[\d128-\d255]告诉sed以配合在范围128-255十进制值字符(即非ASCII字符),并且第二个和第三个正斜杠之间的空字符串告诉sed用空字符串替换匹配的模式(即删除它们)。

与许多其他程序不同,sed可以选择就地更新文件(而不是手动写入不同的文件然后替换原始文件):

sed -i 's/[\d128-\d255]//g' input_file.csv
Run Code Online (Sandbox Code Playgroud)

以下是如何sed处理您的第一个示例字符串:

$ echo "'÷ÞW' , 'ŸŸŸŸŸŸŸ', '³ŸŸÙ÷'" | sed 's/[\d128-\d255]//g'
'W' , '', ''
Run Code Online (Sandbox Code Playgroud)