删除csv unix中的特殊字符并修复新行

时间:2016-08-11 11:18:43

标签: shell csv unix sql-loader

Here is the Actual junk character screen shot

以下是我在csv中的示例数据。

$('form').submit(function(e){
$('#output').hide();  
e.preventDefault();
// Or with: return false;        

在上面的字段中,我有好的数据以及垃圾数据和分割到新行的行。 我想删除这个特殊字符(由于这个特殊的字符和空格,行被移动到下一行)以及将此分割线合并为一行。

目前我正在使用类似下面的内容,这需要花费大量时间:

tr -cd'\ 11 \ 12 \ 15 \ 40- \ 176'| gawk -v RS =''''NR%2 == 0 {gsub(/ \ n /,“”)} {printf(“%s%s”,$ 0,RT)}'MY_FILE.csv> MY_FILE。 csv.tmp

在文件中附上原始数据的屏幕截图。

2 个答案:

答案 0 :(得分:0)

您可以使用

tr -c '[:print:]\r\n' ' ' <bad.csv >better.csv

摆脱不可打印的角色......

sed '/[^"]$/ { N ; s/\n// }' better.csv | sed '/[^"]$/ { N ; s/\n// }' >even_better.csv

将覆盖大多数情况(即在随机引用后无法捕获额外的换行符)

- Samson Scharfrichter

答案 1 :(得分:0)

传统的unix工具(如awk)可能遇到的一个问题是,虽然它支持字段分隔符,但它不支持引号+逗号样式的CSV格式,如截图或示例数据中的格式。 Awk可以使用字段分隔符分隔记录中的字段,但它在字段周围没有引用盔甲的概念,因此嵌入的逗号也被视为字段分隔符。

如果您对此感到满意,因为您的纯文本数据都不包含逗号,也不包含任何“不可打印”的数据。数据包括偶然的逗号,然后你可以只考虑引号作为字段的一部分。毕竟,他们是可打印的角色。

如果您想将多行记录加入一行并删除任何不可打印的字符,则以下awk one-liner可能会执行此操作:

awk -F, 'NF<10{$0=last $0;last=$0} NF<10{next} {last="";sub(/[^[:print:]]/,"")} 1' inputfile

请注意,如果换行符位于最后一个逗号和最后一个字段的内容之间,则除了,因为从awk的角度来看,空字段有效并且&#39 ; s无需加入。如果这个逻辑与您的数据不匹配,那么您将获得另一个有趣的编程任务。 :)

让我们分解awk脚本,看看它的作用。

awk -F, '             # Set comma as the field separator...
  NF<10 {             # For any lines that have fewer than 10 fields...
    $0=last $0        # Insert the last "saved" line here,
    last=$0           # and save the newly joined line for the next round.
  }
  NF<10 {             # If we still have fewer than 10 lines,
    next              # repeat.
  }
  {
    sub(/[^[:print:]]/,"")     # finally, substitute an empty string
  }                            # for all non-printables,
  1' inputfile                 # And print the current line.