我正在使用perl将逗号分隔文件转换为制表符分隔文件:
perl -e ' $sep=","; while(<>) { s/\Q$sep\E/\t/g; print $_; } warn "Changed $sep to tab on $. lines\n" ' csvfile.csv > tabfile.tab
但是,我的文件还有其他逗号,我不想在特定列中分隔。这是我的文件的例子:
ADNP, "descript1, descript2", 1
PTB, "descriptA, descriptB", 5
我只想将引号之外的逗号转换为制表符,如下所示:
ADNP descript1, descript2 1
PTB descriptA, descriptB 5
无论如何要用perl,python或bash来做这个吗?
答案 0 :(得分:3)
使用Text::CSV
#!/usr/bin/env perl
use strict;
use warnings;
use Text::CSV;
#configure our read format using the default separator of ","
my $input_csv = Text::CSV->new( { binary => 1 } );
#configure our output format with a tab as separator.
my $output_csv = Text::CSV->new( { binary => 1, sep_char => "\t", eol => "\n" } );
#open input file
open my $input_fh, '<', "sample.csv" or die $!;
#iterate input file - reading in 'comma separated'
#printing out (to stdout -can use filehandle) tab separated.
while ( my $row = $input_csv->getline($input_fh) ) {
$output_csv->print( \*STDOUT, $row );
}
答案 1 :(得分:1)
在python中
import csv
with open('input', 'rb') as inf:
reader = csv.reader(inf)
with open('output', 'wb') as out:
writer = csv.writer(out, delimiter='\t')
writer.writerows(reader)
答案 2 :(得分:0)
您需要正则表达式来帮助您。在python中它只是:
>>> re.split(r'(?!\B"[^"]*),(?![^"]*"\B)', 'ADNP, "descript1, descript2", 1'
['ADNP', ' "descript1, descript2"', ' 1']
答案 3 :(得分:0)
建立rll的正则表达式答案,你可以把它变成像你正在做的那样的perl oneliner
perl -ne 'BEGIN{$,="\t";}@a=split(/(?!\B"[^"]*),(?![^"]*"\B)/);print @a' csvfile.csv > tabfile.tab
答案 4 :(得分:0)
这个工作:
var express = require('express')
var router = express.Router()
var app = express()
app.route('/verb/:optionalParameter?').get(function(req, res, next) { console.log('hello world') })
将parens放入要拆分的模式中,将捕获的分隔符与拆分元素一起返回,并有效地将包含引号的字符串分隔为单独的列表元素,这些元素在检测到引号时可以区别对待。您只需删除引用字符串的逗号和引号,并替换其他元素中的制表符,然后使用制表符连接元素(以便引用的字符串与制表符连接到其他已经标记的字符串。
答案 5 :(得分:0)
Text::CSV模块正是您所需要的。解析CSV文件时需要考虑很多因素,而且您真的不想自己处理所有这些问题。