识别ANSI编码的CSV中的所有非标准特殊字符

时间:2012-08-28 08:57:00

标签: php javascript csv utf-8 ansi

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

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

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

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

1 个答案:

答案 0 :(得分: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;
      }
    }
  }
}