亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

刪除 CSV 文件特定列中具有重復值的行

刪除 CSV 文件特定列中具有重復值的行

PHP
MM們 2023-08-26 10:06:40
我這里有 data.csv:id: 10, location: Canada, people: 12id: 10, location: United States, people: 15id: 15, location: England, people: 19id: 16, location: India, people: 20id: 16, location: Germany, people: 9我希望它使用 PHP 輸出:id: 10, location: Canada, people: 12id: 15, location: England, people: 19id: 16, location: India, people: 20通過刪除第一列中具有相同值的行。我怎樣才能做到這一點?(我是 PHP 新手,真的不知道在這里要做什么;我嘗試了其他人為類似問題制作的一些腳本,但它們似乎不起作用)我更希望它回顯結果而不是覆蓋或創建一個新文件。
查看完整描述

2 回答

?
楊魅力

TA貢獻1811條經驗 獲得超6個贊

使用 fgetcsv 逐行讀取 csv 并創建數組,其中“:”后面的內容是鍵,后面的內容是值。


然后您可以刪除重復項。


當您只有數據時,您需要構建 csv 字符串。您可以直接使用它或將其存儲在輸出 csv 文件中。


<?php


$handle = fopen("data.csv", "r");


// parse csv line by line and create data array with its information

$data = [];

while (($row = fgetcsv($handle)) !== false) {

  $newRow = [];

  foreach ($row as $field) {

     $parts = explode(':', $field);

     $key = trim($parts[0]);

     $value = trim($parts[1]);


     $newRow[$key] = $value;

  }


  $data[] = $newRow;

}


// iterate data and remove duplicate ids - keep only first id occurence

$indexedData = [];

foreach ($data as $row) {

  if (!isset($indexedData[$row['id']])) {

    $indexedData[$row['id']] = $row;

  }

}


var_dump($indexedData);


// create csv string with new data

$result = '';

foreach ($indexedData as $row) {

  $fields = [];

  foreach ($row as $key => $value) {

    $fields[] = $key.': '.$value;

  }

  $result .= implode(', ', $fields).PHP_EOL;

}


var_dump($result);

$索引數據:


array(3) {

  [10]=>

  array(3) {

    ["id"]=>

    string(2) "10"

    ["location"]=>

    string(6) "Canada"

    ["people"]=>

    string(2) "12"

  }

  [15]=>

  array(3) {

    ["id"]=>

    string(2) "15"

    ["location"]=>

    string(7) "England"

    ["people"]=>

    string(2) "19"

  }

  [16]=>

  array(3) {

    ["id"]=>

    string(2) "16"

    ["location"]=>

    string(5) "India"

    ["people"]=>

    string(2) "20"

  }

}

$結果:


string(111) "id: 10, location: Canada, people: 12

id: 15, location: England, people: 19

id: 16, location: India, people: 20

"

或者,如果您不關心 csv 中的數據(例如您不需要人數統計等),這里是更簡單的版本:


<?php


$handle = fopen("data.csv", "r");


$data = [];

while (($row = fgetcsv($handle)) !== false) {

  if (!isset($data[$row[0]])) {

    $data[$row[0]] = $row;

  }

}


$result = '';

foreach ($data as $row) {

  $result .= implode(',', $row).PHP_EOL;

}


var_dump($result);

$結果是一樣的。


查看完整回答
反對 回復 2023-08-26
?
守候你守候我

TA貢獻1802條經驗 獲得超10個贊

您實際上不需要解析整行數據。一次preg_replace()調用即可刪除后來出現的重復行。


以下模式僅用于處理彼此相鄰的重復行。它不是為了處理由非重復項分隔的重復項而構建的。


代碼:(演示


echo preg_replace(

         '/(^id: (\d+),.+)(?:\Rid: \2,.+)+/m',

         '$1',

         file_get_contents('data.csv')

     );

或者,您可以使用單個循環并維護一個查找數組來確定之前是否已回顯 id。


即使重復行被非重復行分隔開,這也將起作用。


代碼:(演示


foreach (explode(PHP_EOL, $csv) as $line) {

    $firstColumn = strtok($line, ',');

    if (!isset($lookup[$firstColumn])) {

        echo $line . PHP_EOL;

        $lookup[$firstColumn] = true;

    }

}


查看完整回答
反對 回復 2023-08-26
  • 2 回答
  • 0 關注
  • 261 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號