0

我有一个 ANSI 编码的 CSV 文件,其中包含许多“问题”特殊字符。我正在寻找一个脚本(最好是 php 或 javascript),我可以使用它来检查 CSV 中的每条记录并识别那些有问题的字符。

循环遍历 CSV 记录没有问题,所以我只是在寻找一种好方法来确定单个字符串是否包含任何字符,如果该字符串直接插入到 UTF-8 编码文件中会导致问题。

背景:我使用脚本将 ANSI CSV 直接转换为 UTF-8 XML,而没有先将 CSV 转换为 UTF-8。我的愚蠢举动。该脚本为包含问题字符的记录创建了 XML 实体,但脚本尝试在其中插入包含问题字符的文本的所有 textNode 最终都为空。我现在正在寻找的是一种解析原始 CSV 文件并识别所有包含问题字符的记录的方法。拥有约 18,000 条记录,这不是我想手动完成的工作 :-)

澄清 我应该首先将 ANSI CSV 转换为 UTF-8,然后在 UTF-8 编码的 CSV 文件上运行我的“转换为 XML”脚本。相反,我跳过了第一步,在 ANSI 编码的 CSV 文件上运行了我的“转换为 XML”脚本。为所有单元格创建了 XML 实体,但带有诸如 —(em dash)和 ½(一半)字符的单元格的 XML 实体都是空的。“转换为 XML”脚本无法将这些字符串插入 UTF-8 编码的 XML 文档(在 PHP 中使用 DOMDocument)。

4

1 回答 1

0

伙计们,这又快又脏,但这是我在这种情况下需要的那种解决方案。我使用以下代码扫描原始 CSV,查看每行中的每个字符。任何带有 字符的行ord() > 127,我都插入到第二个 CSV 中。这个新的 CSV 文件仅包含具有“特殊”字符的行。

在这种特殊情况下,我的原始 CSV 大于 5MB,而仅包含带有特殊字符的行的新 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 回答