Php 打开两个CSV文件,比较并将其添加到阵列中
我试图从两个不同的CSV文件中获取信息,并将它们添加到一个数组中。我基本上是打开第一个文件,将其内容作为字符串放入数组中。接下来是棘手的部分。这两个文件都有一个共同的ID字段,因此只要ID匹配,就必须将其放入数组中 我尝试了两种不同的方法,打开一个文件,在这个文件中打开另一个,比较并保存到数组。另一种方法是将两个文件中的所有信息发送到两个分离数组,然后找到匹配项并将它们发送到第三个数组 代码如下:Php 打开两个CSV文件,比较并将其添加到阵列中,php,arrays,csv,Php,Arrays,Csv,我试图从两个不同的CSV文件中获取信息,并将它们添加到一个数组中。我基本上是打开第一个文件,将其内容作为字符串放入数组中。接下来是棘手的部分。这两个文件都有一个共同的ID字段,因此只要ID匹配,就必须将其放入数组中 我尝试了两种不同的方法,打开一个文件,在这个文件中打开另一个,比较并保存到数组。另一种方法是将两个文件中的所有信息发送到两个分离数组,然后找到匹配项并将它们发送到第三个数组 代码如下: $handle0 = \fopen("/Data/mountain1.csv", "r"); i
$handle0 = \fopen("/Data/mountain1.csv", "r");
if ($handle0) {
$line0 = 0;
while (($buffer0 = fgets($handle0, 4000)) !== false) {
if ($line0 > 0){
$mountainArray = str_getcsv($buffer0, ",");
$obj = array();
$obj["id"] = $mountainArray[2];
$obj["name"] = $mountainArray[0];
$obj["country"] = $mountainArray[1];
$handle1 = fopen("/Data/mountain1.csv", "r");
if ($handle1) {
$line1 = 0;
while (($buffer1 = fgets($handle1, 4000)) !== false) {
if ($line1 > 0) {
$latlonArray = str_getcsv($buffer1, ",");
$content = array();
$content["id"] = $latlonArray[1];
if ((int)$content["id"] == (int)$obj["id"]) {
$obj["latitude"] = $latlonArray[7];
$obj["longitude"] = $latlonArray[8];
}
$line1++;
}
}
fclose($handle1);
}
$mountain[] = $obj;
}
$line0++;
}
fclose($handle0);
}
这段代码只是循环,什么也不做
if ($handle0) {
while (($buffer0 = fgets($handle0, 4000)) !== false) {
$mountainArray = str_getcsv($buffer0, ",");
$content0 = array();
$content0["id"] = $mountainArray[2];
$content0["name"] = $mountainArray[0];
$content0["country"] = $mountainArray[1];
$mountain[] = $content0;
}
fclose($handle0);
}
if ($handle1) {
while (($buffer1 = fgets($handle1, 4000)) !== false) {
$latlonArray = str_getcsv($handle1, ",");
$content1 = array();
$content1["id"] = $latlonArray[1];
$content1["latitude"] = $latlonArray[7];
$content1["longitude"] = $latlonArray[8];
$latlon[] = $content1;
}
fclose($handle1);
}
foreach ($mountain as $row0) {
$obj = array();
$obj["id"] = $row0["productUid"];
$obj["name"] = $row0["name"];
$obj["country"] = $row0["address"];
foreach ($latlon as $row1) {
if((int)$row1["id"] == (int)$row0["id"]) {
$obj["latitude"] = $row1["latitude"];
$obj["longitude"] = $row1["longitude"];
}
}
$mountains[] = $obj;
}
如果我理解正确的话,这个文件只会返回null…如果我理解正确的话,那么您正试图根据两个csv文件的id获取它们之间的交集 您将要做的是尽可能减少遇到内存问题的机会 在要比较的文件中获取并构建一个
id
s数组。一个简单的fopen
然后在循环中调用fgetcsv
应该可以工作
$ids = array();
$fp = fopen($file1, "r");
while ($row = fgetcsv($fp)){
// assuming first field contains the id
$ids[$row[0]] = "";
}
fclose($fp);
打开要比较的文件,并执行相同的fopen、fgetcsv循环,但检查在步骤1中构建的列表中是否存在每个id。然后,如果它在列表中,则将其添加到结果中
$results = array();
$fp = fopen($file2, "r");
while ($row = fgetcsv($fp)){
if (isset($ids[$row[0])){
$results[] = $row;
}
}
这种方法避免了将两个文件中的所有数据都表示为一个数组。这可能有点超出需要,但对我来说是可行的 csv1.csv
id,val
0,cat
1,dog
id,val
2,brid
1,cat
csv2.csv
id,val
0,cat
1,dog
id,val
2,brid
1,cat
PHP
<?php
header("content-type: text/plain");
$array = [];
$i = 0;
$csv1 = "csv1.csv";
$csv2 = "csv2.csv";
// Load file 1 into an array
// Skip row 1
if (($handle = fopen($csv1, "r")) !== FALSE){
while (($data = fgetcsv($handle)) !== FALSE){
if($i == 0){$i++; continue;}
$array[] = $data;
$i++;
}
fclose($handle);
}
$i = 0;
// Load file 2 into the array if the values don't exist
// Skip row 1
if (($handle = fopen($csv2, "r")) !== FALSE){
while (($data = fgetcsv($handle)) !== FALSE){
if($i == 0){$i++; continue;}
$inarray = false;
foreach($array as $itm){
if(in_array($data[0], $itm)){
$inarray = true;
break;
}
}
if(!$inarray){
$array[] = $data;
}
$i++;
}
fclose($handle);
}
print_r($array);
根据您的代码,我假设:
- 对于包含山脉数据的CSV文件:id位于位置2,名称位于0,国家位于1
- 对于具有以下坐标的CSV文件:id为1,纬度为7,经度为8
我决定为您提供一个更全面的代码片段,它适用于任何数量的CSV文件,您只需将它们添加到$csvFiles
数组中,并使用文件名作为键,文件类型作为值
<?php
$result = array();
$csvFiles = array(
'mountains.csv' => 'Mountain',
'coordinates.csv' => 'Coordinate'
);
foreach ($csvFiles as $csvFile => $type) {
if ($handle = fopen($csvFile, 'r')) {
$lineNumber = 0;
while ($data = fgetcsv($handle, 128, ',')) {
if (!$lineNumber) {
$lineNumber++;
continue;
}
switch ($type) {
// Store the record in the result array
case 'Mountain':
$record = array(
'id' => $data[2],
'name' => $data[0],
'country' => $data[1]
);
$id = $record['id'];
$result[$id] = $record;
break;
// Add longitude and latitude to the record
// if already in the result array
case 'Coordinate':
$record = array(
'id' => $data[1],
'latitude' => $data[7],
'longitude' => $data[8]
);
$id = $record['id'];
if (!empty($result[$id])) {
$result[$id] = array_merge($result[$id], $record);
}
break;
}
}
}
}
print_r($result);
坐标.csv
输出将是:
Array
(
[ 1] => Array
(
[id] => 1
[name] => aaa
[country] => USA
[latitude] => 10.00
[longitude] => 20.00
)
[ 2] => Array
(
[id] => 2
[name] => aab
[country] => Canada
[latitude] => 1.00
[longitude] => 2.00
)
[ 3] => Array
(
[id] => 3
[name] => aac
[country] => USA
[latitude] => 2.00
[longitude] => 4.00
)
[ 4] => Array
(
[id] => 4
[name] => bbb
[country] => Portugal
[latitude] => 5.00
[longitude] => 10.00
)
[ 5] => Array
(
[id] => 5
[name] => ccc
[country] => Germany
[latitude] => 100.00
[longitude] => 200.00
)
)
你想把这两个文件做成一个数组吗?是的,这样我就可以把我需要的数据存储在一个地方,以后再使用它,比如在mysql语句中使用它们,或者创建另一个csv。谢谢!它确实帮助了我,但我也在想,没有函数怎么办?我已经更新了答案,并将代码从函数移到了相应的案例中。我无法验证此代码重构,但我认为它可以正常工作。非常感谢!无论有无功能,这两种代码都像一个符咒