0

多数の「問題のある」特殊文字を含む ANSI エンコードの CSV ファイルがあります。CSV 内の各レコードをチェックし、問題のある文字を含むレコードを特定するために使用できるスクリプト (できれば php または javascript) を探しています。

CSV レコードをループするのに問題はないので、文字列が UTF-8 でエンコードされたファイルに直接挿入された場合に問題を引き起こす文字が単一の文字列に含まれているかどうかを判断する良い方法を探しています。

背景: 最初に CSV を UTF-8 に変換することを気にせずに、スクリプトを使用して ANSI CSV を直接 UTF-8 XML に変換しました。私の側の骨の折れる動き。スクリプトは問題のある文字を含むレコードの XML エンティティを作成しましたが、スクリプトが問題のある文字を含むテキストを挿入しようとしたすべての textNodes は空になりました。私が今探しているのは、元の CSV ファイルを解析し、問題のある文字を含むすべてのレコードを識別する方法です。〜18,000件のレコードがあるので、手動でやりたい仕事ではありません:-)

明確化 最初に ANSI CSV を UTF-8 に変換してから、UTF-8 でエンコードされた CSV ファイルに対して「XML に変換」スクリプトを実行する必要がありました。代わりに、最初のステップをスキップして、ANSI でエンコードされた CSV ファイルに対して「XML に変換」スクリプトを実行しました。すべてのセルに対して XML エンティティが作成されましたが、— (em ダッシュ) や ½ (半分) などの文字を含むセルの XML エンティティはすべて空でした。「XML への変換」スクリプトは、これらの文字列を UTF-8 でエンコードされた XML ドキュメント (PHP で DOMDocument を使用) に挿入するのに暗黙のうちに失敗しました。

4

1 に答える 1

0

みなさん、これは手っ取り早く汚いですが、この状況で私が必要としていたのはこのような解決策でした。次のコードを使用して元の CSV をスキャンし、各行の各文字を確認しました。の文字を含む行はord() > 127、2 番目の CSV に挿入しました。この新しい CSV ファイルには、「特殊」文字を含む行のみが含まれていました。

この特定のケースでは、元の CSV は 5 MB を超えていましたが、特殊文字を含む行のみを含む新しい CSV ははるかに小さく、数百 KB のオーダーであったため、操作がはるかに簡単になりました。

$input_file  = fopen($input_filePath, 'rt');
$output_file = fopen($output_filePath, 'w');

// Get the column headers of the file
$headers = fgetcsv($input_file);

// Loop through each row
while (($row = fgetcsv($input_file)) !== FALSE)
{
  // Loop through each cell
  foreach ($headers as $i => $header)
  {
    $cell = $row[$i];
    // Loop through each char until we find a 'special' char
    // or reach the end of the cell, whichever comes first
    for ($j = 0; $j < strlen($cell); $j++)  {   
      if (ord(substr($cell, $j, 1)) > 127) {
        // If we find a special char, add this row to the new CSV file
        fputcsv($output_file, $row);
        break;
      }
    }
  }
}
于 2012-09-12T16:48:22.907 に答える