【问题标题】:Value's not visible when importing CSV after values are added by fputcsv with php在 fputcsv 使用 php 添加值后导入 CSV 时值不可见
【发布时间】:2020-12-04 10:57:46
【问题描述】:

我正在尝试为我的网络项目制作一个翻译模块,但我碰壁了。我编写了两个函数,一个用于导入 CSV 数据,另一个用于更改、删除和添加新数据到 CSV 文件。

除了添加部分之外,一切都像魅力一样。它将数据添加到 CSV 文件中,但是当我想通过 PHP 将其导入网站时,它不会显示添加的值。 (它看到它们应该是值,但它返回空结果)我用于读取 csv 文件的函数是:

// Load in CSV (File name, delimiter, Fixed array[key,value] (optional))
function load__CSV($filename='', $delimiter=';', $fixed = null){
    if(!file_exists($filename) || !is_readable($filename)) {
        return FALSE;
    }

    $header = NULL;
    $data = array();
    if (($handle = fopen($filename, 'r')) !== FALSE) {
        while (($row = fgetcsv($handle, 100000, $delimiter)) !== FALSE) {
            if (!$header) {
                $header = $row;
            } else {
                $data[] = array_combine($header, $row);
            }
        }
        fclose($handle);
    }

    if($fixed != null) {
        foreach($data as $entry){
            $set_csv[$entry[''.$fixed[0].'']] = $entry[''.$fixed[1].''];
        }
    } else {
        $set_csv = $data;
    }

    return $set_csv;
}

我用来添加、编辑或删除 CSV 内容的功能是:

// Change csv
function update__csv($csv = 'csv/language.csv',$key = array(2,''),$values = array([3,''],[4,'']),$status = 'change') {
    $input = fopen(BASE_URL.$csv, 'r');
    $output = fopen(BASE_URL.'csv/temporary.csv', 'w');

    while (false !== ($data = fgetcsv($input, 10000, ";"))) {
        if ($data[$key[0]] == $key[1]) {
            foreach ($values as $value) {
                $data[$value[0]] = $value[1];
            }
            if ($status == 'change' || $status == 'new') {
                fputcsv($output, $data, ";");
            }
        } else {
            fputcsv($output, $data, ";");
        }
    }

    if($status == 'new'){
        fputcsv($output, $values, ";");
    }

    fclose( $input );
    fclose( $output );

    unlink(BASE_URL . $csv);
    rename(BASE_URL . 'csv/temporary.csv', BASE_URL . $csv);
}

如果我将新值添加到 CSV 文件,然后在我的 PC 上打开 CSV 并再次将其(不更改任何内容)安全地保存为 UTF-8 编码的 CSV,那么它会按预期工作并加载正确的数据。如果我在 Notepad++ 中打开 CSV,我会看到手动添加的项目和 php 添加的项目之间的差异:

我尝试了其他编码方法,但这对我来说有点新,所以我认为我做错了什么。提前感谢您帮助我!

【问题讨论】:

  • 我不知道这里到底应该有什么问题,而且你的截图也没有帮助。您在部分数据下方画了一条弯曲的红线 - 这应该告诉我们现在是什么?
  • 对不起你的权利。屏幕截图来自 Notepad++,其中添加了弯曲的红线下的代码(我认为当您手动保存 CSV 时)。但是,如果您在 PHP 中使用 'fputcsv' 将新的数据行放入 CSV 文件中,则它不会出现在弯曲线的部分。如果我手动添加该部分并保存文件,则数据读取应该是这样。给定的两个函数有效,但我唯一的问题是使用 PHP 加载 CSV 时使用“fputcsv”添加的数据不可见。
  • 如果fputcsv 写入的列比预期的少,那么最合乎逻辑的结论是你填充了你传递给它的数据数组,开始时值太少......所以,调试一下?
  • 感谢您的提示,但我做了一些调试(我刚才也尝试了一些东西),它确实是额外的 coloms。但是当我最初制作 CSV 文件时,它们只有 5 个 coloms。仅当我使用“fputcsv”添加新值(因此不用于删除或编辑值)时,它才会添加 2 个额外的 coloms。我不明白它为什么这样做。我在代码中没有发现任何东西可以解释为什么它会添加这些额外的coloms。
  • fputcsv 在一个输出行中创建尽可能多的列,因为您输入的数组包含元素。

标签: php csv fputcsv


【解决方案1】:

经过更多调试后,我确实找到了答案。数组的一个值不包含字符串,而是一个真假语句。这意味着它没有以正确的方式将数据添加到 CSV 文件中。

我通过在将每个变量放入数组之前将strval() 添加到它来修复它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多