使用 PHP 从 CSV 文件中删除空白行

4

能否从CSV文件中删除所有空白行?

我正在尝试计算CSV文件的所有行数,但希望排除不包含特定列或整行值的行。

目前我使用以下代码来计算行数。

$import = file($target_path, FILE_SKIP_EMPTY_LINES);
$num_rows = count($import);
echo $num_rows;

示例:

Jun,Bronse,137 Raven,Princeton,TX,75407,2147088671,Nell@Gmail.Com,1990,CHEVROLET,K1500,,
,,,,,,,,,,,,
,,,,,,,,,,,,
,,,,,,,,,,,,
Nella,Brown,111 Venna St,Princeton,TX,75407,2147177671,lakb@Gmail.Com,1993,CHEVROLET,K1500,,
Jun,Bronse,137 Raven,Princeton,TX,75407,2147088671,Nell@Gmail.Com,1990,CHEVROLET,K1500,,
,,,,,,,,,,,,
Jun,Bronse,137 Raven,Princeton,TX,75407,2147088671,Nell@Gmail.Com,1990,CHEVROLET,K1500,,

empty()foreach()explode() 是一个不错的起点。 - sjagr
5个回答

12
$lines = file("test.csv", FILE_SKIP_EMPTY_LINES | FILE_IGNORE_NEW_LINES);
$num_rows = count($lines);
foreach ($lines as $line) {
    $csv = str_getcsv($line);
    if (empty($csv[SPECIFIC_COLUMN])) {
        $num_rows--;
    }
}

如果您不想检查特定的列,而只是要过滤掉所有列都为空的行,请将其更改为:

    if (count(array_filter($csv)) == 0) {

对于str_getcsv()加一,之前甚至从未听说过它。我猜想这个函数与explode()相比的优势在于它可以正确处理包含逗号的字符串吗?(例如,1,2,“这是一个带逗号的字符串,请检查一下”,3,4)。 - sjagr
只获取一行空白行,而不是特定列,如何处理? - telexper
@telexper 如果数组的所有值都为空,则!array_filter($csv)将返回true,但这可能会变得耗时(最好只使用简单的foreach)... 这部分很容易。 - sjagr
1
如果所有列都为空,则特定列将为空,因此检查将执行它。 - Barmar
@Barmar 但不仅限于完全空白的行。 - sjagr
显示剩余2条评论

3

对于空行:

$lines = file("test.csv", FILE_SKIP_EMPTY_LINES | FILE_IGNORE_NEW_LINES);
$num_rows = count($lines);
foreach ($lines as $line) {
    $csv = str_getcsv($line);
    if (!array_filter($csv)) {
        $num_rows--;
    }
}

这对我来说在2018年8月非常有用。 - Louis Eloy

0
$filename = "test.csv";

if (($fp = fopen($filename, "r")) !== FALSE) { 
    $rows = explode("\n", $fp);
    $csv = "";

    foreach($rows as $r) {
        if(str_replace(array(" ", ","), "", $r) != "")
            $csv .= $r."\n";
    }

    file_put_contents($filename, $csv);;
}

空行可以被存储在CSV中,例如:",,,,,,,,"。你的代码将会产生不准确的结果。更不用说@telexper已经使用了FILE_SKIP_EMPTY_LINES - sjagr

0

基本上就是Barmar已经发布的内容,但如果你需要处理(许多)大*文件,我建议尝试使用rtrim(或ltrim),因为通常这些函数在像你这样的任务中会更快:

$lines = file("test.csv", FILE_SKIP_EMPTY_LINES | FILE_IGNORE_NEW_LINES);
$num_rows = count($lines);
foreach ($lines as $line) {
    if (!rtrim($line, ',')) {
        $num_rows--;
    }
}

*所谓“大规模”,是指真正值得的大规模。不要浪费时间进行微观优化。


-5

使用Notepad++打开.csv文件。然后在查找和替换中搜索^\*s,点击“全部替换”按钮。这应该可以解决你的问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接