【问题标题】:Group all lines with the same word in first column in csv在csv的第一列中使用相同的单词对所有行进行分组
【发布时间】:2015-08-24 02:05:30
【问题描述】:

我的 csv 文件中有两列:first_column 和 second_column。我想将第二列中的所有行分组为一个用“,”分隔的字符串,如果它们在第一列中都有相同的单词,则将它们输出到文本文件中。

first_column   second_column
a              Chris
a              Jake
a              Paula
b              Anita
b              Lionel
b              Sheila

期望的输出

a: Chris, Jake, Paula
b: Anita, Lionel, Sheila

这是我尝试过的。我似乎只收到来自 second_column 的第一个字母。任何指针都会很棒。

$csv_file = fopen("test.csv", "r");
$text_file = fopen("test.txt","w");

$data = array();

if ($csv_file) 
{
    while (($line = fgets($csv_file)) !== false) 
    {
        $column_1 = $line[0];
        $column_2 = $line[1];

        if (!empty($column_1)) 
        {
            $data [$column_1] = column_2;
        }
    }

    fclose($csv_file);
    fclose($text_file);
} 

else 
{
    // error opening the file.
}

//print_r($data);

【问题讨论】:

  • 你的 csv 行是由什么分隔的,由哪个分隔符分隔?
  • @Rizier123 换行?
  • 对不起,写得不是很清楚我的意思是你的专栏,用逗号,分号?
  • 那么这个问题我们在哪里?
  • @Rizier123 显然我看到我的错误是 fgets 而不是 fgetcsv 这给了我 csv 文件中的第二个字符而不是第二列。我设法通过更改该行并进行了一些更改来修复它。

标签: php file csv


【解决方案1】:

这应该适合你:

在这里,我首先将您的.csv 文件放入带有file() 的数组中。然后我遍历每一行并创建一个数组,其中第一列是键,第二列是子数组的值。

在此之后,您可以循环遍历您创建的数组和implode() 每个子数组,其中包含您想要的预期行的键。然后您可以将带有file_put_contents() 的数据保存到您的.txt 文件中。

<?php

    $csv_file = "test.csv";
    $text_file = "test.txt";

    $lines = file($csv_file, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
    array_shift($lines);
    foreach($lines as $line) {
        list($key, $value) = explode(",", $line);  //Change your .csv delimiter here, if you use something else than ,
        $data[$key][] = $value;
    }

    foreach($data as $key => $arr)
        $content[] = $key . ": " . implode(",", $arr) . PHP_EOL;

    file_put_contents($text_file, $content);

?>

【讨论】:

    【解决方案2】:

    将结果存储在数据数组中,然后将其 bacj 写入文本文件应该可以工作。

    $csv_file = fopen("test.csv", "r");
    $text_file = fopen("test.txt","w");
    
    $data = array();
    
    if ($csv_file) 
    {
      while (($line = fgets($csv_file)) !== false) 
      {
         $column_1 = $line[0];
         $column_2 = $line[1];
    
         if (!isset($data[$column_1])) 
         {
            $data[$column_1] = column_2
         } else {
            $data[$column_1] = $data[$column_1] .',' . $column_2
         }
      }
    
       foreach($data as $k=>$d ){
          fputs($text_file, "$k: $d") ;
      }
    
       fclose($csv_file);
       fclose($text_file);
    } 
    else 
    {
      // error opening the file.
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-02-20
      • 2017-06-14
      • 1970-01-01
      • 1970-01-01
      • 2019-12-25
      • 2022-01-19
      • 1970-01-01
      相关资源
      最近更新 更多