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é)果是一樣的。

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;
}
}
- 2 回答
- 0 關(guān)注
- 277 瀏覽
添加回答
舉報