PHP 脚本从 CSV 创建 XML 文件,但包含 0 个内容

PHP script creates XML files from CSV's but holds 0 contents

提问人:grimx 提问时间:5/18/2023 最后编辑:grimx 更新时间:5/18/2023 访问量:56

问:

我创建了一个 php 脚本来读取 19 个 csv 文件并规范化数据 - 不保存重复数据(站点 ID、名称和地理编码),只保存每条具有值的记录的属性。我已经打印了 csv 以确保在脚本中加载,并且脚本还制作了 data-site-id 文件,但文件中包含 0 个内容?


<?php

ini_set('display_errors', '1');
ini_set('display_startup_errors', '1');
error_reporting(E_ALL);

// List of CSV files
$csvFiles = [
    'data-203.csv',
    'data-206.csv',
    'data-209.csv',
    'data-270.csv',
    'data-213.csv',
    'data-215.csv',
    'data-271.csv',
    'data-375.csv',
    'data-395.csv',
    'data-447.csv',
    'data-452.csv',
    'data-463.csv',
    'data-500.csv',
    'data-501.csv',
    'data-672.csv',
    'data-188.csv',
    'data-209.csv',
    'data-481.csv',
    'data-228.csv',
    'data-459.csv',

];

// Loop through each CSV file
foreach ($csvFiles as $csvFile) {
    $csvFilePath = __DIR__ . '/' . $csvFile;
    
    // Open the CSV file
    if (($handle = fopen($csvFilePath, 'r')) !== false) {
        // Create an XMLWriter instance
        $xmlWriter = new XMLWriter();
        $xmlWriter->openURI(csvFileToXmlFile($csvFile));
        $xmlWriter->startDocument('1.0', 'UTF-8');
        $xmlWriter->startElement('data');

        // Read the CSV file line by line
        while (($data = fgetcsv($handle)) !== false) {
            // Skip empty lines
            if (count($data) === 0) {
                continue;
            }

            // Ensure the array has the necessary indexes
            if (count($data) >= 4) {
                // Extract the necessary data
                $stationId = $data[0];
                $name = $data[1];
                $geocode = $data[2];
                $attribute = $data[3];

                // Check if the attribute has a value
                if (trim($attribute) !== '') {
                    // Start XML record element
                    $xmlWriter->startElement('record');
                    $xmlWriter->writeAttribute('station_id', $stationId);
                    $xmlWriter->writeAttribute('name', $name);
                    $xmlWriter->writeAttribute('geocode', $geocode);
                    $xmlWriter->writeAttribute('attribute', $attribute);
                    // End XML record element
                    $xmlWriter->endElement();
                }
            }
        }

        // Close XML elements and file
        $xmlWriter->endElement();
        $xmlWriter->endDocument();
        $xmlWriter->flush();
        fclose($handle);

        // Output success message
        $xmlFile = csvFileToXmlFile($csvFile);
        echo "XML file generated successfully: $xmlFile\n";
    }
}

// Function to convert CSV file name to XML file name
function csvFileToXmlFile($csvFile) {
    $fileParts = pathinfo($csvFile);
    $xmlFile = $fileParts['filename'] . '.xml';
    return $xmlFile;
}

?>

如前所述,我已经打印了 csv,以确保它们在目录中被读取。我还更改了 $xmlWriter->openURI($csvFileToXmlFile($csvFile));更改为 $xmlWriter->openURI(csvFileToXmlFile($csvFile));。我一直在得到未定义的偏移量 2 和 3。第 52 行和第 53 行的错误也已经消退。

csv 的示例图像,不确定如何发送 https://drive.google.com/file/d/1EUHN4RCJFq-XrIBQNvZphh7vxZDdbf_R/view?usp=share_link

空白 XML - data-481.xml https://drive.google.com/file/d/1pEinOeosPQQRoeQoJHfEb6L_80iD5bqr/view?usp=share_link

所需的 XML

php xml csv fgets fgetcsv

评论

1赞 Nigel Ren 5/18/2023
您能否显示其中一个 csv 文件的示例(data-203.csv 就可以了)。
0赞 grimx 5/18/2023
底部有附件

答:

1赞 RiggsFolly 5/18/2023 #1

你必须学会仔细观察你的数据。这些文件实际上是“SemiColon seperated value”文件文件csvssv

您需要做的就是更改这行代码,让分隔符知道分隔符是fgetcsv();

    while (($data = fgetcsv($handle,10000,';')) !== false) {

data-481.csv 的第二个问题

所有行的列都是空的$data[1], $data[2], $data[3]

所以

$attribute = $data[3];
if (trim($attribute) !== '') {

控制是否将行写入 XML 文件失败,因此不写入任何数据

评论

0赞 grimx 5/18/2023
您好,您能看一下我上一个问题的答案吗,因为这是建议的输出数据,据说是 csv
0赞 RiggsFolly 5/18/2023
它有一个扩展,但分隔符实际上是一个.csv;
0赞 grimx 5/18/2023
这已经通过数据 481 .xml 是空的
0赞 RiggsFolly 5/18/2023
好吧,481 输入文件可能在某种程度上有所不同。给我看那个文件,或者你自己看看
0赞 grimx 5/18/2023
是什么原因导致的,因为它生成了 18 个完全相同的文件,但这个文件不同,我已经打开了它,它看起来是一样的