2017-07-10 11 views
1

異なるデータを持つフォルダに複数のCSVファイルがあります。私は1つのCSVファイルを一度に読み込み、データをXMLに変換してから、次のCSVファイルを読み込む前に.xmlとして出力したいと考えています。PHPを使用してCSVをXMLに変換する

現在、私が持っているCSVファイルにはヘッダー行があります。コードは、今すぐ私はそれがヘッダー行を持つすべてのCSVファイルのためにうまく動作します。

ただし、ヘッダー行がないファイルを読み込むと、エラーが発生します。ヘッダー行に見出しがないかどうかを検出して、コード内の変数にあらかじめ設定されている入力文字列にすることができます。これは可能ですか?

現在のコード/動作しません例で

CSV File example that will work with above code

CSV File example that will NOT work with the above code

を処理willnotますCSVファイルの

function converttoxml($input_filename) { 

echo $input_filename; 

//set the delimiter 
$delimiter = "," ; 

//set count to 0 
$row_count++ ; 

//strip the input filename of the extension 
$stripped = pathinfo($input_filename, PATHINFO_FILENAME); 

//set output filename 
$outputFilename = UPLOAD_DIR."/".$stripped.".xml"; 

//open inputfilename 
$inputFile = fopen($input_filename, 'rt'); 

//get input file pointers for csv parsing 
$headers = fgetcsv($inputFile); 

//create new DOM document 
$doc = new DomDocument(); 

//set the output to clean 
$doc->formatOutput = true; 

//create element 
$root = $doc->createElement('Shipping_Details'); 

$root = $doc->appendChild($root); 

//while there are rows in the csv file 
while (($row = fgetcsv($inputFile)) !== FALSE) { 

    //create container row 
    $container = $doc->createElement('Job_Header_Details'); 

     //for loop 
     foreach ($headers as $i => $header) { 

      //explode with the delimiter the header 
      $arr = explode($delimiter, $header); 

      //print_r($arr); 

       //for loop 
       foreach ($arr as $key => $ar) { 

        //only accept regualar expressions matching this 
        $child = $doc->createElement(preg_replace("/[^A-Za-z0-9]/","",$ar)); 

        //add the previous child to $child 
        $child = $container->appendChild($child); 

        //explode row with delimiter 
        $whole = explode($delimiter, $row[$i]); 

        //left and right trim anything with speechmarks 
        $value = $doc->createTextNode(ltrim(rtrim($whole[$key], '"') ,'"')); 

        //append previous value to $value 
        $value = $child->appendChild($value); 

       }//for 
     }//for 

    //append to root - container 
    $root->appendChild($container); 

}//while 



echo "Saving the XML file\n" ; 

$result = $doc->saveXML(); 

echo "Writing to the XML file\n" ; 

$handle = fopen($outputFilename, "w"); 

fwrite($handle, $result); 

fclose($handle); 

return $outputFilename; 

例としては、私は信じていますそれは、行がありません。この場合、私は...何とか例

$column_1 = "<heading1>"; 
$column_2 = "<heading2>"; 
$column_3 = "<heading3>"; 
$column_4 = "<heading4>"; 
$column_5 = "<heading5>"; 
$column_6 = "<heading6>"; 

などのために。

でそれを各列見出しはどうあるべきかを定義して、入力したい

だから、スクリプトが実行され、それが中に見出しを検出したときCSVファイルは、それらを使用します。それは彼らが存在しないことを検出した場合でも、それは、入力には上記の$列の例を使用します。

CSVファイルには、ヘッダの記述に

Missing header error

を持っていないときに私が取得エラー

アイデア

+0

各名前が有効なxml要素名であることをヘッダーで確認してください。https://stackoverflow.com/questions/2519845/how-to-check-if-string-is-a -valid-xml-element-nameはそれらをチェックする正規表現を与えます。したがって、これをそれぞれ解析し、無効なものを置き換えます。 –

+0

良い質問です。投稿を編集し、スクリーンショットではなくテキストとしてCSVファイルを追加できますか?どうやって?任意のテキストエディタ(Excelや他のスプレッドシートアプリケーションではない)でcsvを開き、ツールバーにSOの '{}'ボタンで書式設定して、ポストの本体にいくつかの最上行をコピーして貼り付けます。 – Parfait

答えて

0

ただ、これを試してみるためには、...

a,1223のヘッダに渡されたときは、 a,heading2のヘッダを生成
//get input file pointers for csv parsing 
    $headers = fgetcsv($inputFile); 

    $row = 1; 
    foreach ($headers as &$header) { 
     if (preg_match('/\A(?!XML)[a-z][\w0-9-]*/i', $header) === 0) { 
      $header = 'heading'.$row; 
     } 
     $row++; 
    } 
    unset($header); 

を追加しました。一方、a,ba,bとなります。

更新:いずれかの要素でエラーが発生した場合でも、この行を見てデータとして処理することをお勧めします。

関連する問題