【问题标题】:CSV: Undefined Offset -> Convert to XMLCSV:未定义的偏移量 -> 转换为 XML
【发布时间】:2017-08-01 21:56:42
【问题描述】:

我有这个 CSV 文件:http://www.gamesdeal.com/media/feedgenerator/Gamekey.csv

用 PHP 得到这个错误:

PHP 注意:未定义的偏移量:6 英寸

但问题是我无法自己创建 CSV 文件。它来自一家商店。所以,我无法修改它...有人知道我该如何解决这个错误吗?

这是我的代码:

function csvToXML($inputFilename, $outputFilename, $delimiter = ','){

    // Open csv to read
    $inputFile = fopen($inputFilename, 'rt');

    // Get the headers of the file
    $headers = fgetcsv($inputFile, 0, $delimiter);

    // Create a new dom document with pretty formatting
    $doc = new DOMDocument('1.0', 'utf-8');
    $doc->preserveWhiteSpace = false;
    $doc->formatOutput = true;

    // Add a root node to the document
    $root = $doc->createElement('products');
    $root = $doc->appendChild($root);

    while (($row = fgetcsv($inputFile, 0, $delimiter)) !== false) {

        $container = $doc->createElement('product');

        foreach ($headers as $i => $header) {
              $child = $doc->createElement($header);
              $child = $container->appendChild($child);
              $value = $doc->createTextNode($row[$i]);
              $value = $child->appendChild($value);
        }
        $root->appendChild($container);
    }

$strxml = $doc->saveXML();
    $handle = fopen($outputFilename, 'w');
    fwrite($handle, $strxml);
    fclose($handle);
}

【问题讨论】:

  • 您的输入文件的数据字段中是否包含逗号,而不仅仅是分隔符?您可能需要在 fgetcsv 调用中添加外壳类型。

标签: php xml csv converter offset


【解决方案1】:

问题来了:

header: products_price <tab> price_currency

data: 5.45 EUR (no tab between 5.45 and EUR)

所以在标题中定义了 7 个字段,但在数据中只有 6 个(而且大多数记录没有 EAN 值,但最后有一个选项卡,所以应该没问题)。

要解决此问题,您可以:

  • 手动读取所有字段

  • 首先将标题中的products_price &lt;tab&gt; price_currency替换为products_price price_currency

  • $headers中删除price_currency

  • 或者以某种方式让解析器知道只有 6 个字段而不是 7 个

之后您可能需要更正价格字段。

【讨论】:

  • 感谢您的回答。我试图修复它,但它不起作用......我目前的问题是实施你的想法...... - 你能给我一个简短的例子吗? - 此外,分隔符是"\t"。你在这里看不到它。但我给函数定界符"\t"。如果我不给函数任何分隔符,正常的分隔符是","
  • 对于第一次快速测试,您可以手动编辑文件 - 在标题中将两个价格字段组合在一起,如下所示:products_price_price_currency 并查看是否正常工作。如果没有,请尝试查看哪里出错 - 可能会打印这些行(然后删除 foreach 循环),然后打印带有 foreach 循环的字段。
  • 另外,在第 4111 SD0006586 行,products_name 中有一个选项卡(- 之前),因此字段将向右移动(但这不应该破坏您的代码)。
  • 此外,大多数 EAN 值将为空。我不知道这是否可能是代码中的问题(我不知道 php,所以我不能确定)。但也许你还是想检查一下,避免创建一个空节点。
  • 我会这样做的。谢谢! :D
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-08-18
  • 2021-07-20
  • 2011-03-13
  • 1970-01-01
  • 2022-01-02
  • 2013-01-25
相关资源
最近更新 更多