【问题标题】:Unset rows (based on row name) csv through php通过php取消设置行(基于行名)csv
【发布时间】:2016-01-23 13:04:47
【问题描述】:

我有一个带有静态列名的 .CSV 文件。我每天都会收到它,所以我必须每天自动编辑它。

第一行是行名,例如:row1;row2;row3,row4,row5

例如,当我想取消设置“row2”和“row4”时。

如何根据名称取消设置多行?

我找到了一些关于根据行位置删除行或行的教程,但没有什么能完全帮助我。

这就是现在所拥有的:

$inFile  = 'original.csv';
$outFile = 'edited.csv';

$delimiter = ';';
$enclosure = '"';   

$read = fopen($inFile, 'r');
$write = fopen($outFile, 'w');
if ($write && $read) {
    while (($data = fgetcsv($read)) !== FALSE) {

        // how to unset multiple row names

        fputcsv($write, $data, $delimiter, $enclosure);
    }
}
fclose($write);
fclose($read);

另外,我打开原始文件时需要使用分隔符和附件吗?

【问题讨论】:

  • 您不会从 csv 中删除行。您只是不将它们输出到新的 csv 文件中。 if (row doesn't contain what I"m deleting) { output row }
  • 是的,谢谢,我将所有内容都更改为“未设置”而不是“删除”
  • CSV 不是数据库格式,您不能像使用数据库一样使用它。您需要手动编写代码来操作字符串值中的数据。
  • 更具体地说,您需要使用file_get_contents()file_put_contents()explode()implode()if/then 逻辑,更不用说循环了。

标签: php csv


【解决方案1】:

您好,您可以尝试更新以下代码:

$inFile  = 'original.csv';
$outFile = 'edited.csv';
$delimiter = ';';
$enclosure = '"';   
$removeFields = array('color');

$write = fopen($outFile, 'w');

if ($write) {
    $rows = file($inFile);
    $first = false;
    foreach($rows as $row) {
        $csvToPHP = str_getcsv($row, $delimiter, $enclosure);
        if (!$first) {
            $headers = array_flip($csvToPHP);
            $first = true;
        }

        foreach($removeFields as $remove) {
            unset($csvToPHP[$headers[$remove]]);
        }
        fputcsv($write, $csvToPHP, $delimiter, $enclosure);
    }   
}
fclose($write);

我用了一个测试csv original.csv:

name,age,color
test1,20,red
test2,32,blue
test3,92,green
test4,12,red
test5,56,orange

编辑结果.csv:

name
test1
test2
test3
test4
test5

希望对您有所帮助。祝你好运!

【讨论】:

  • 这看起来很有希望,但它不起作用(还)。当我打开原始文件时,它可能与分隔符和附件有关吗?它们不一样..
  • 我已经更新了答案。它现在也通过读取文件来使用分隔符。
猜你喜欢
  • 2011-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-07
  • 2020-12-16
  • 2015-04-17
相关资源
最近更新 更多