我有一个可以解析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);
但是如何以逗号分隔的方式将数据恢复?
答案 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
将数组元素连接到字符串中。这使用字符串文字,而不是正则表达式。
/