2017-03-11 6 views
1

로 변환> 오프셋 정의 그러나 문제는 필자 자신이 CSV 파일을 만들 수 없다는 것입니다. 그것은 상점에서입니다. 그래서, 그것을 수정할 수 없습니다 ... 누군가가이 오류를 해결할 수있는 방법을 알고 있습니까? 여기CSV는 내가이 CSV 파일을 XML

내 코드 : 여기

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); 
} 
+0

입력 파일에 쉼표가 구분 기호로 사용되는 것이 아니라 데이터 필드 내에 있습니까? [fgetcsv] (http://php.net/manual/en/function.fgetcsv.php) 호출에 인클로저 유형을 추가해야 할 수도 있습니다. –

답변

1

문제입니다 : 7 개 정의 필드,하지만 데이터 만 6가 헤더에 따라서

header: products_price <tab> price_currency 

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

(대부분의 기록은하지 않습니다 EAN 값을 가지고 있지만 마지막에는 탭이 있으므로 확인해야합니다).

는이 문제를 해결하려면 수 :
  • $headers

  • 또는에서 price_currency를 제거 수동으로

  • 먼저 헤더에 products_price price_currencyproducts_price <tab> price_currency을 대체 모든 필드를 읽고 어떻게 든 파싱 해 보자. r은 7 대신 6 개의 필드가 있다는 것을 알고 있습니다.

아마 가격 필드를 나중에 수정해야합니다.

+0

답변 해 주셔서 감사합니다. 나는 그것을 고치려고했지만 그것이 작동하지 않습니다 ... 내 문제는 현재 귀하의 아이디어를 구현하는 것입니다 .. - 당신은 내게 짧은 예제를 줄 수 있을까요? - 또한 구분자는''\ t ''입니다. 여기에서는 볼 수 없습니다. 그러나 나는이 함수에 구분 기호' "\ t"'를 부여한다. 함수를 구분 기호로 사용하지 않으면 일반 구분 기호는'',''입니다. –

+1

첫 번째 빠른 테스트를 위해 파일을 수동으로 편집 할 수 있습니다. 머리글에서 두 가격 필드를 products_price_price_currency와 함께 결합하여 제대로 작동하는지 확인하십시오. 그렇지 않다면 오류가 발생한 곳을 확인하십시오. 아마 줄을 인쇄하고 (foreach 루프를 제거한 다음) 나중에 foreach 루프를 사용하여 필드를 인쇄하십시오. –

+1

또한 4111 행의 SD0006586에는 products_name에 ('-' 앞에 오기 전에) 탭이 있기 때문에 필드가 오른쪽으로 이동합니다 (그러나 코드가 손상되지 않아야 함). –