我在包含不同数据的文件夹中有多个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文件没有标题说明时出现的错误
有什么想法吗?
答案 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
。
更新:虽然如果任何元素失败,您可能希望将此行作为数据处理。