0

我正在开发一个从一个非常旧的应用程序(一个 DOS 基础应用程序)导出 .csv 文件的项目。导出有效,但它会截断一列(似乎是随机的)并将其插入下一行。它通常是单词的后半部分或类似的东西。我想知道,如果有办法使用 Perl 删除这些行。我目前使用 Perl 脚本来删除所有逗号分隔符并用竖线 (|) 分隔符替换它们。我发现使用管道可以更轻松地插入到 SQL 中使用。我对 Perl 非常非常陌生,但是这段代码可以完美地用管道替换逗号。有没有办法使用它并删除“坏”行。我尝试使用批量插入导入 SQL,但收到诸如“第 49 行第 17 列的批量加载数据转换错误(截断)”之类的错误。我查看了导出,这些错误发生在包含所有 17 行的完整列的位置,但下一行只是 |cial) 或 |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 );
}
4

2 回答 2

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.
于 2013-08-08T13:28:57.190 回答
0

我最近在 Text::CSV_XS 上遇到了类似的问题。几个“随机”行被截断并与下一行合并。在截断的行中,一些内容实际上丢失了,并且缺少字段分隔符和行分隔符。

接受性能损失后,我求助于 Text::CSV_PP,问题就消失了。如果您的 CSV 创建时间不紧迫,我建议您尝试 Text::CSV_PP,因为对于大文件,它肯定会更慢。

于 2016-02-05T09:09:36.330 回答