Как я могу разбить CSV-файл на PHP?

У меня большой CSV-файл. Я хочу разделить этот файл на отдельные файлы на основе значения в одном из полей.

Это то, что я сделал. Используя fgetcsv, я преобразовываю CSV в массив и, используя in_array , проверяю содержимое и показываю, содержит ли он строку в массиве.

Я буду получать строку сравнения из другого текстового файла итеративно, чтобы проверить, содержится ли она в csv. В этом случае я указал его как «Тестирование».

Ниже приведен код:

 if (($handle = fopen("test.csv", "r")) !== FALSE) { while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) { if(in_array("Testing", $data)) { var_dump($data); } } fclose($handle); } 

Это работает, но теперь я застрял. Как записать $data в другой файл CSV? Или есть лучший способ сделать это?

Это на самом деле довольно просто, и если строка просто должна быть на линии, вам даже не нужно fgetcsv. Просто

 $srcFile = new SplFileObject('test.csv'); $destFile = new SplFileObject('new.csv', 'w+'); foreach ($srcFile as $line) { if (strpos($line, 'testing') !== FALSE) { $destFile->fwrite($line); } } 

Это создаст два файла. Первый из них содержит содержимое исходного файла. Второй способ создания всего нового файла для строк, содержащих вашу строку поиска. Затем мы просто перебираем каждую строку и проверяем, существует ли строка поиска. Если это так, мы записываем его в файл назначения.

Этот исходный файл не будет затронут. Если вы хотите иметь один файл со строкой поиска и одним файлом без, просто создайте третий объект SplFileObject и добавьте блок else, чтобы при записи строки в этот. В конце удалите исходный файл csv.

Вы должны сделать какую-то сложную вещь, которую я предоставляю для себя в качестве основной идеи, вот код:

 //opening file if ($fp = fopen('log.csv', 'r')) { $line_number = 0; //loop for Reading file as line by line csv file while ($line = fgetcsv($fp, 0, ';')) { if ($line_number++ == 0) { continue; } //array data string to make possible to provide file name //according to column name required $date = explode(' ', $line[0]); //Change the column name according to your needs $file = $date[0] .'.log'; file_put_contents( //change the folder name according to your needs 'monthly/'. $file, //printing data in appended file implode(';', $line) ."\n", FILE_APPEND ); } //closing file fclose($fp); } 

Он читает файл CSV по строкам, извлекает дату из первого столбца и создает новый файл и добавляет к нему данные.

Заметка:

папка «ежемесячно» должна быть доступна для записи