5

我有一个包含超过 500,000 行的 .CSV 文件,我需要:

  1. 查找所有“空格双引号空格”序列并替换为空
  2. 查找所有“空格双引号”序列并替换为空
  3. 查找所有双引号并替换为空

.CSV 行示例:

"DISH Hartford & New Haven  (Hartford)", "206", "FBNHD", " 06028", " East Windsor Hill", "CT", "Hartford County"

** 所需输出**

DISH Hartford & New Haven  (Hartford),206,FBNHD,06028,East Windsor Hill,CT,Hartford County

我需要删除所有双引号 ( ") 和逗号 ( ) 前后的空格,

我试过了

$ cd /Users/Leonna/Downloads/
$ cat bs-B2Bformat.csv | sed s/ " //g

这给了我大于提示的“命令不完整”,所以我尝试了:

$ cat bs-B2Bformat.csv | sed s/ " //g
sed: 1: "s/": unterminated substitute pattern
$ cat bs-B2Bformat.csv |sed s/ \" //g
sed: 1: "s/": unterminated substitute pattern
$

我在 Excel 中编辑的行太多(Excel 不会加载所有行)甚至是文本编辑器。我怎样才能解决这个问题?

4

5 回答 5

12

从这里引用:

为了符合 POSIX,请使用字符类 [[:space:]] 而不是 \s,因为后者是 GNU sed 扩展。

基于此,我建议以下内容,正如Jonathan Leffler指出的那样,它可以跨 GNU 和 BSD 实现移植。

sed -E 's/[[:space:]]?"[[:space:]]?//g' <path/to/file>

-E标志在 BSD 实现上启用扩展正则表达式。在 GNUsed上,它是无文档的,但正如这里所讨论的,它支持与 BSD 标准的兼容性。

引用自BSD 手册sed

-E 将正则表达式解释为扩展(现代)正则表达式而不是基本正则表达式(BRE)。

将上述命令应用于包含以下单行的文件

“DISH Hartford & New Haven (哈特福德)”、“206”、“FBNHD”、“06028”、“东温莎山”、“CT”、“哈特福德县”

它产生

DISH Hartford & New Haven (Hartford),206,FBNHD,06028,East Windsor Hill,CT,Hartford County

于 2013-09-17T02:34:07.147 回答
1

这对我有用。这是你想要的吗 ?

 sed -e 's|", "|,|g' -e 's|^"||g' -e 's|"$||g' file.csv

 echo '"DISH Hartford & New Haven (Hartford)", "206", "FBNHD", " 06028", " East Windsor Hill", "CT", "Hartford County"' | sed -e 's|", "|,|g' -e 's|^"||g' -e 's|"$||g'

 DISH Hartford & New Haven (Hartford),206,FBNHD, 06028, East Windsor Hill,CT,Hartford County
于 2013-09-17T02:25:01.080 回答
1

这应该这样做:

sed -i 's/\(\s\|\)"\(\|\s\)//g' bs-B2Bformat.csv
于 2013-09-17T02:17:47.787 回答
0

一种方法是使用及其csv模块:

import csv 
import sys 

## Open file provided as argument.
with open(sys.argv[1], 'r') as f:

    ## Create the csv reader and writer. Avoid to quote fields in output.
    reader = csv.reader(f, skipinitialspace=True)
    writer = csv.writer(sys.stdout, quoting=csv.QUOTE_NONE, escapechar='\\')

    ## Read file line by line, remove leading and trailing white spaces and
    ## print.
    for row in reader:
        row = [field.strip() for field in row]
        writer.writerow(row)

像这样运行它:

python3 script.py csvfile

这会产生:

DISH Hartford & New Haven  (Hartford),206,FBNHD,06028,East Windsor Hill,CT,Hartford County
于 2013-09-17T21:07:25.547 回答
0

当前所有答案似乎都错过了:

$ cat bs-B2Bformat.csv | sed s/ " //g
sed: 1: "s/": unterminated substitute pattern
$ cat bs-B2Bformat.csv |sed s/ \" //g
sed: 1: "s/": unterminated substitute pattern
$

上面的问题是缺少单引号。它应该是:

$ cat bs-B2Bformat.csv | sed 's/ " //g'
                             ^        ^

如果没有单引号,bash 会在空格处拆分并发送三个单独的参数(至少对于 的情况 \")。sed 认为它的第一个论点是公正的s/

编辑:仅供参考,不需要单引号,它们只是使这种情况更容易。如果要使用双引号,只需转义要保留以进行匹配的双引号:

$ cat bs-B2Bformat.csv | sed "s/ \" //g"
于 2015-06-01T05:59:01.563 回答