我有一个.CSV文件,我需要超过500,000行:
.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不会加载所有行)甚至是文本编辑器。我该如何解决这个问题?
答案 0 :(得分:10)
引自here:
对于POSIX兼容性,请使用字符类[[:space:]]而不是\ s,因为后者是GNU sed扩展。
基于此,我建议如下,正如Jonathan Leffler指出的那样,它可以在GNU和BSD实现中移植。
sed -E 's/[[:space:]]?"[[:space:]]?//g' <path/to/file>
-E
标志在BSD实现上启用扩展正则表达式。在GNU sed
上它没有文档,但正如here所讨论的那样,它可以兼容BSD标准。
-E将正则表达式解释为扩展(现代)常规 表达式而不是基本的正则表达式(BRE)。
将上述命令应用于包含以下单行的文件
“DISH Hartford&amp; New Haven(Hartford)”,“206”,“FBNHD”,“06028”,“东温莎山”,“CT”,“哈特福德郡”
它产生
DISH Hartford&amp; New Haven(Hartford),206,FBNHD,06028,East Windsor Hill,CT,Hartford County
答案 1 :(得分:1)
这应该这样做:
sed -i 's/\(\s\|\)"\(\|\s\)//g' bs-B2Bformat.csv
答案 2 :(得分: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
答案 3 :(得分:0)
一种方法是使用python及其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
答案 4 :(得分: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"