我有一个很大的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文件?或者有更好的方法吗?
答案 0 :(得分:6)
实际上非常简单,如果字符串必须在线上,你甚至不需要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文件。
答案 1 :(得分:1)
你必须做一些棘手的事情,我提供了一些基本的想法,这里是代码:
//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文件,从第一列中提取日期部分并创建新文件并将数据附加到其中。
文件夹“每月”必须是可写的