У меня большой 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 по строкам, извлекает дату из первого столбца и создает новый файл и добавляет к нему данные.
папка «ежемесячно» должна быть доступна для записи