第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決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 新手,真的不知道在這里要做什么;我嘗試了其他人為類似問題制作的一些腳本,但它們似乎不起作用)我更希望它回顯結(jié)果而不是覆蓋或創(chuàng)建一個新文件。
查看完整描述

2 回答

?
楊魅力

TA貢獻1811條經(jīng)驗 獲得超6個贊

使用 fgetcsv 逐行讀取 csv 并創(chuàng)建數(shù)組,其中“:”后面的內(nèi)容是鍵,后面的內(nèi)容是值。


然后您可以刪除重復項。


當您只有數(shù)據(jù)時,您需要構(gòu)建 csv 字符串。您可以直接使用它或?qū)⑵浯鎯υ谳敵?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);

$索引數(shù)據(jù):


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"

  }

}

$結(jié)果:


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

id: 15, location: England, people: 19

id: 16, location: India, people: 20

"

或者,如果您不關(guān)心 csv 中的數(shù)據(jù)(例如您不需要人數(shù)統(tǒng)計等),這里是更簡單的版本:


<?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);

$結(jié)果是一樣的。


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

TA貢獻1802條經(jīng)驗 獲得超10個贊

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


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


代碼:(演示


echo preg_replace(

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

         '$1',

         file_get_contents('data.csv')

     );

或者,您可以使用單個循環(huán)并維護一個查找數(shù)組來確定之前是否已回顯 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 關(guān)注
  • 277 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號