【问题标题】:Reading a csv and writing it columns into another csv file读取 csv 并将其列写入另一个 csv 文件
【发布时间】:2019-10-05 04:44:57
【问题描述】:

我正在尝试从 CSV 文件中提取特定列并将它们存储在另一个 CSV 文件中。我的 CSV 文件是制表符分隔的,并且某些列值位于单独的行中。当我尝试在另一个文件中读取和写入它时,它会将它们视为不同的列并将它们写入不同的行。我希望输出文件与 CSV 文件中提供的信息相似。任何帮助,将不胜感激。

当我导入原始 CSV 文件时,有一些列位于 \n\r 的不同行中。我尝试了多种方法,但得到了类似的输出。 test.csv中的内容(\t是tab):

"abc" \t "123" \t "Tom"

"xyz" \t 

"456" \t "Jack"

"mno" \t "789" 

\t "Jim"
$file1 = 'try.csv';
$fp=fopen($file1,'w');
if (($handle = fopen("test.csv", "r")) !== FALSE) {
    while (($data = fgetcsv($handle, 1000, "\t")) !== FALSE) 
    {
        $num = count($data);
        for ($c=0; $c < 2; $c++) 
        {
            echo $data[$c] . "<br />\n";
        fwrite($fp, $data[$c]);

        }
    fwrite($fp,"\n");
    }
    fclose($fp);
    fclose($handle);
}

我希望输出采用这种格式。

"abc" \t "123" 

"xyz" \t  "456"

"mno" \t  "789"

【问题讨论】:

  • 如果 \n\r 包含在引号中,这是 CSV 的标准,这不会是一个问题,例如:abc\t"123\n\rxyz"\t456 将被拆分为 ["abc", "123\n\rxyz", "456"] 问题出在文件上,试图读起来会有问题。
  • 如此处所示Sandbox 这不是一个文件,但它的工作方式相同。试图解析它(如果它缺少引号以逃避行返回)将是一个巨大的混乱。您最好按制表符拆分文件,然后按列数使用array_chunk,并希望数据中没有制表符。

标签: php file csv


【解决方案1】:

鉴于您提供的数据,这是我能做的最好的事情

$string = <<<CSV
"abc" \t "123" \t "Tom"
"xyz" \t
"456" \t "Jack"
"mno" \t "789"
\t "Jim"
CSV;

print_r(array_chunk(array_filter(array_map('trim',preg_split("/\t|\r\n|\n/", $string))), 3));

输出:

Array
(
    [0] => Array
        (
            [0] => "abc"
            [1] => "123"
            [2] => "Tom"
        )

    [1] => Array
        (
            [0] => "xyz"
            [1] => "456"
            [2] => "Jack"
        )

    [2] => Array
        (
            [0] => "mno"
            [1] => "789"
            [2] => "Jim"
        )

)

Sandbox

这不是魔法,是代码!

PS。将$string 替换为您的文件内容,并希望数据中没有标签。

【讨论】:

  • 您好@ArtisticPhoenix,感谢您的回答,但它不适用于所有数据。假设如果我在这个例子中使用这个代码,它不会给出预期的结果。这是代码link的链接,但它只有两行7列的csv行。它应该创建两个数组。有什么建议吗?
猜你喜欢
  • 1970-01-01
  • 2019-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多