我正在开发一个从一个非常古老的应用程序(DOS基础应用程序)导出.csv文件的项目。导出有效,但它会截断一列(似乎是随机的)并将其插入下一行。它通常是单词的后半部分或类似的东西。我想知道,如果有办法使用Perl删除这些行。我目前使用Perl脚本删除所有逗号分隔符并用管道(|)分隔符替换它们。我发现使用管道可以更容易地插入到SQL中使用。我对Perl非常非常新,但是这段代码非常适合用管道替换逗号。有没有办法使用它并删除“坏”行。我已尝试使用批量插入导入SQL,但会收到错误,例如第49行第17列的“批量加载数据转换错误(截断)”。我查看了导出,这些错误发生在有一个包含所有17行的完整列,但下一行只是一个或多个| 3。我希望我明白这一点。感谢您的帮助。
use strict;
use warnings;
use Text::CSV_XS;
my $in_file = "Deal_Log.csv";
my $out_file = "NewDeal.csv";
open my $fh, '<', $in_file or die "$in_file: $!";
open my $out_fh, '>', $out_file or die "$out_file: $!";
my $in_csv = Text::CSV_XS->new;
my $out_csv = Text::CSV_XS->new( { sep_char => '|', eol => "\n" } );
while( my $row = $in_csv->getline( $fh ) ) {
$out_csv->print( $out_fh, $row );
}
答案 0 :(得分:1)
不要立即输出该行。相反,请在下一行中读取并检查列数。如果全部为17,则输出上一行,否则将该行附加到上一条记忆行。
#!/usr/bin/perl
use warnings;
use strict;
use Text::CSV_XS;
my $in_file = 'Deal_Log.csv';
my $out_file = 'NewDeal.csv';
my $size = 17;
open my $fh, '<', $in_file or die "$in_file: $!";
open my $out_fh, '>', $out_file or die "$out_file: $!";
my $in_csv = 'Text::CSV_XS'->new;
my $out_csv = 'Text::CSV_XS'->new( { sep_char => '|',
eol => "\n",
} );
my $previous = [];
while( my $row = $in_csv->getline($fh) ) {
if (@$row == $size) {
$out_csv->print($out_fh, $previous) if @$previous;
$previous = $row;
} else {
$previous->[-1] .= $row->[0];
}
}
$out_csv->print($out_fh, $previous); # Do not forget to print the last remembered line.
答案 1 :(得分:0)
我最近遇到了与Text :: CSV_XS类似的问题。几个&#34;随机&#34;线被截断并与下一行合并。在截断的行中,实际上丢失了一些内容,并且缺少字段分隔符和行分隔符。
接受性能损失后,我使用了Text :: CSV_PP,问题就消失了。如果您的CSV创建时间不重要,我建议您尝试使用Text :: CSV_PP,因为对于大文件,它肯定会慢一些。