将csv文件转换为txt文件

时间:2015-09-15 14:02:02

标签: python bash perl csv

我正在使用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来做这个吗?

6 个答案:

答案 0 :(得分:3)

使用Text::CSV

在Perl中处于琐碎状态

#!/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文件时需要考虑很多因素,而且您真的不想自己处理所有这些问题。