Удалить пустые строки из файлов CSV в php

Можно ли удалить все пустые строки из 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,[email protected],1990,CHEVROLET,K1500,,
,,,,,,,,,,,,
,,,,,,,,,,,,
,,,,,,,,,,,,
Nella,Brown,111 Venna St,Princeton,TX,75407,2147177671,[email protected],1993,CHEVROLET,K1500,,
Jun,Bronse,137 Raven,Princeton,TX,75407,2147088671,[email protected],1990,CHEVROLET,K1500,,
,,,,,,,,,,,,
Jun,Bronse,137 Raven,Princeton,TX,75407,2147088671,[email protected],1990,CHEVROLET,K1500,,

person telexper    schedule 31.01.2014    source источник
comment
empty() вместе с foreach() и explode() — хорошее место для начала   -  person sjagr    schedule 01.02.2014


Ответы (5)


$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) {
person Barmar    schedule 31.01.2014
comment
+1 за str_getcsv(), даже не слышал о нем раньше. Я предполагаю, что преимущество этой функции по сравнению с explode() заключается в том, что она будет правильно обрабатывать строки с запятыми в них? (например, 1,2,"Here's a string, check it out",3,4) - person sjagr; 01.02.2014
comment
как насчет того, чтобы просто получить пустую строку, а не конкретный столбец? - person telexper; 01.02.2014
comment
@telexper !array_filter($csv) вернет true, если все значения массива пусты, но это может занять много времени (лучше просто использовать простой foreach)... Эта часть проста - person sjagr; 01.02.2014
comment
Если все столбцы пусты, конкретный столбец будет пуст, поэтому проверка сделает это. - person Barmar; 01.02.2014
comment
@Barmar, но не только для совершенно пустой строки - person sjagr; 01.02.2014
comment
Невозможно использовать возвращаемое значение функции в контексте записи в /.../... в строке, если (пусто(array_filter($csv))) - person telexper; 01.02.2014
comment
@ Barmar У меня похожий вопрос: Link - person Grischa; 12.07.2014

Для пустых строк:

$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--;
    }
}
person sjagr    schedule 31.01.2014
comment
Это было полезно для меня по состоянию на август 2018 года. - person addo.lou; 06.08.2018

В основном то, что Бармар уже опубликовал, но если вам нужно обработать (много) больших * файлов, я бы порекомендовал попробовать 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--;
    }
}

*Под большим я подразумеваю настолько большой, что оно действительно того стоит. Не тратьте время на микрооптимизацию.

person Jürgen Thelen    schedule 03.02.2014

используйте блокнот ++, чтобы открыть файл .csv. Затем найдите ^\*s, чтобы найти и заменить, и нажмите кнопку «Заменить все». Это должно решить вашу проблему.

person painteR    schedule 23.06.2018

person    schedule
comment
Пустая строка может быть сохранена в CSV как ,,,,,,,, (например). Ваш код будет давать неточные результаты. Не говоря уже о том, что @telexper уже использовал FILE_SKIP_EMPTY_LINES - person sjagr; 01.02.2014