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 に答える