使用PHP

时间:2017-07-10 15:14:49

标签: php xml csv data-conversion

我在包含不同数据的文件夹中有多个CSV文件。我想一次读入1个CSV文件,将数据转换为XML,然后将文件输出为.xml,然后再读取下一个CSV文件。

目前,我所拥有的CSV文件都有一个标题行。我现在的代码可以正常运行所有包含标题行的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;

将/不会处理的CSV文件示例

CSV File example that will work with above code

CSV File example that will NOT work with the above code

对于不起作用的示例,我认为这是因为缺少标题行。在这种情况下,我想以某种方式定义每个列标题应该是什么并输入它。

例如

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

等。

因此,当脚本运行并且它检测到CSV文件中的标题时,它将使用它们。但当它检测到它们不存在时,它将使用上面的$ column示例输入in。

CSV文件没有标题说明时出现的错误

Missing header error

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

试试这个,添加......

    //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,1223的标头中传递时会产生a,heading2的标头。而a,b给出a,b

更新:虽然如果任何元素失败,您可能希望将此行作为数据处理。