从管道分隔到逗号分隔?

时间:2016-05-10 15:31:58

标签: perl parsing csv split

我有一个可以解析CSV文件的工作脚本,在将数据重新组合之前擦除数据并进行一些更改。我正在使用的原始文件是逗号分隔的。但我刚收到所有将要运行的实际文件,它们都是管道分隔的。我需要做同样的事情,然后把它们放回到逗号分隔的文件中。

首先,我有 -

\documentclass{article}
\begin{document}
\SweaveOpts{concordance=TRUE}

\newcommand{\QPR}[1]
{
\ifcase #1
\or 
         A
\or
         B
\or
         C
\fi
}

<<g, echo=FALSE, results=tex,prefix=FALSE>>=
S=2:3
@

\QPR{\Sexpr{S[1]}}
\QPR{\Sexpr{S[2]}}
\QPR{\Sexpr{S[3]}}

\end{document}

...解析我的数据,然后目前,我以此结束将数据放回文件中 -

#!/usr/bin/perl/

use strict;
use warnings;
use Data::Dumper;
use Time::Piece;

my $filename = 'records.csv';

open my $FH, $filename
  or die "Could not read from $filename <$!>, program halting.";

# Read the header line.
chomp(my $line = <$FH>);
my @fields = split(/|/, $line);
print Dumper(@fields), $/;

my @data;
# Read the lines one by one.
while($line = <$FH>) {

    chomp($line);

但是如何以逗号分隔的方式将数据恢复?

2 个答案:

答案 0 :(得分:2)

请勿使用拆分解析CSV文件。使用适当的解析器。

use strict;
use warnings 'all';
use autodie;
use Text::CSV_XS;

my $csv_in = Text::CSV_XS->new( { binary => 1, sep_char => "|" } );
my $csv_out = Text::CSV_XS->new( { binary => 1, sep_char => ",", eol => $/ } );
while ( my $row = $csv_in->getline(*ARGV) ) {
    $csv_out->print( *STDOUT, $row );
}

如果确实如此,您只需将更改管道分隔为逗号分隔,将tr '|' ','插入管道。

答案 1 :(得分:1)

一些事情。首先,修复你的shebang(Hill行),使其不包含尾随mSize :: MountainChain -> Size majorHill :: MountainChain -> Name

其次,perl使用正则表达式进行拆分,因此在拆分时你想要转义管道字符:

#!

最后,您可以使用join将数组元素连接到字符串中。这使用字符串文字,而不是正则表达式。

/