【问题标题】:Remove newline after incorrect field splitting in csv file在 csv 文件中不正确的字段拆分后删除换行符
【发布时间】:2020-01-10 14:11:38
【问题描述】:

我使用 linux,我正在尝试为此使用 sed。我从一个机构网站下载了一个 CSV,它提供了一些要分析的数据。每个 CSV 有几千行,每行有很多列(我没有数过,但我认为这个数字没用)。字段用分号分隔并引用,因此每行的格式为:

"Field 1";"Field 2";"Field 3";  .... ;"Field X";

每个正确的行都以分号和'\n'结尾。问题是,有时,有些字段错误地有换行符,解决方法是删除换行符,这样两行就重新合并为一行。错误行示例:

"Field 1";"Field 2";"Fi
eld 3";"Field X";

我发现在开始的引号之后或引号之间的某处可以有一个 \n。

我找到了一种方法来管理最后一种情况,换行符就在引号之后:

sed ':a;N;$!ba;s/";"\n/";"/g' file.csv

但不适用于“引号后不以分号结尾的任意数量的字母字符”。我有一个包含这些行的模式文件(与 -f 一起使用):

:a;N;$!ba;s/";"\n/";"/g
:a;N;$!ba;s/\([A-z]\)\n/\1/g
:a;N;$!ba;s/\([:alpha:]\)\n/\1/g

模式文件的第一行有效,但我尝试了第二行和第三行的组合,但总是得到一个空文件。

【问题讨论】:

    标签: regex csv sed split newline


    【解决方案1】:

    如果当前行不以分号结尾,则读取下一行并将其追加到模式空间并删除换行符。

    sed '/[^;]$/{N;s/\n//}' file
    

    【讨论】:

    • 也许新添加的行也可能匹配第一个条件,在这种情况下需要循环,即sed ':a;/[^;]$/{N;s/\n//;ba}' file
    猜你喜欢
    • 2022-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-27
    • 1970-01-01
    • 2013-09-08
    • 1970-01-01
    相关资源
    最近更新 更多