比较两个csv文件PHP的数据
现在这是我的代码。我被困在如何查找/比较payment.csv和transactions.csv的数据上比较两个csv文件PHP的数据,php,arrays,loops,csv,Php,Arrays,Loops,Csv,现在这是我的代码。我被困在如何查找/比较payment.csv和transactions.csv的数据上 <?php //this shows the name, email, deposit date and amount from payment.csv $data = file("data/payment.csv"); foreach ($data as $deposit){ $depositarray
<?php
//this shows the name, email, deposit date and amount from payment.csv
$data = file("data/payment.csv");
foreach ($data as $deposit){
$depositarray = explode(",", $deposit);
$depositlist = $depositarray;
$name = $depositlist[0];
$email = $depositlist[1];
$depositdate = $depositlist[9];
$depositamount = $depositlist[10];
//echo $depositamount;
}
//this shows the payment date and amount from transaction.csv
$databank = file("datas/transactions.csv");
foreach ($databank as $payment){
$paymentarray = explode(",", $payment);
$paymentlist = $paymentarray;
$paymentdate = $paymentlist[0];
$paymentamount = $paymentlist[5];
//echo $paymentamount;
}
?>
例如:
从payment.csv开始,每个$depositdate&&$depositamount将与transactions.csv$paymentdate&&$paymentamount进行比较
匹配的每一行将保存到一个数组中,然后显示在表中。如果不匹配,则保存到数组并稍后显示
有谁能帮我或给我一个想法来完成这件事吗?只需显示包含匹配数据的所有行
或者像这样:
当一个事务有多个匹配项时,这应该是输出
根据@Ryan Vincent的评论:
<?php
$masterData = array();
//this shows the name, email, deposit date and amount from payment.csv
$data = file("data/payment.csv");
foreach ($data as $deposit){
$depositarray = explode(",", $deposit);
$key = md5($depositlist[9] . $depositlist[10]); //date + amount
$depositlist = $depositarray;
$masterData[$key]['payment'] = array(
'name' => $depositlist[0],
'email' => $depositlist[1],
'depositdate' => $depositlist[9],
'depositamount' => $depositlist[10]
);
}
//this shows the payment date and amount from transaction.csv
$databank = file("datas/transactions.csv");
foreach ($databank as $payment){
$paymentarray = explode(",", $payment);
$key = md5($paymentlist[0] . $paymentlist[5]); //date + amount
$masterData[$key]['transaction'] = array(
'paymentdate' => $paymentlist[0],
'paymentamount' => $paymentlist[5]
);
}
?>
您应该让每一行都包含您的数据,并在有交易时在a行的末尾进行匹配
但正如我所说,因为人们可以在同一天进行相同金额的交易,所以你不知道哪个交易属于哪个人。根据@Ryan Vincent的评论:
<?php
$masterData = array();
//this shows the name, email, deposit date and amount from payment.csv
$data = file("data/payment.csv");
foreach ($data as $deposit){
$depositarray = explode(",", $deposit);
$key = md5($depositlist[9] . $depositlist[10]); //date + amount
$depositlist = $depositarray;
$masterData[$key]['payment'] = array(
'name' => $depositlist[0],
'email' => $depositlist[1],
'depositdate' => $depositlist[9],
'depositamount' => $depositlist[10]
);
}
//this shows the payment date and amount from transaction.csv
$databank = file("datas/transactions.csv");
foreach ($databank as $payment){
$paymentarray = explode(",", $payment);
$key = md5($paymentlist[0] . $paymentlist[5]); //date + amount
$masterData[$key]['transaction'] = array(
'paymentdate' => $paymentlist[0],
'paymentamount' => $paymentlist[5]
);
}
?>
您应该让每一行都包含您的数据,并在有交易时在a行的末尾进行匹配
但正如我所说的,因为人们可以在同一日期进行相同金额的交易,所以你不知道哪个交易属于哪个人。首先,如果它是有效的csv文件,你应该通过fgetcsv解析数据,而不是依赖于字符串中没有逗号 您可以在读取csv1时为存款日期创建索引数组,并在读取csv2时简单地查找此索引。如果有匹配的日期,请比较金额并继续 大概是这样的:
// read csv1, store in array and create index
$data = array();
$fh = fopen($csv1, 'r');
while($row = fgetcsv($fh)) {
$data[] = $row;
$val = $row[$interestd_in];
$key = count($data) - 1;
$idx[$val][] = $key; // array containing all indices
}
fclose($fh);
// read csv2, lookup in index and process further
$fh = fopen($csv2, 'r');
while($row2 = fgetcsv($fh)) {
$val = $row2[$interest2];
if(!empty($idx[$val])) {
foreach($idx[$val] as $key) {
$row1 = $data[$key];
/*
do your further comparisons of these 2 data-lines
and output, if matches found
*/
}
}
}
fclose($fh);
首先,如果它是有效的csv文件,那么应该通过fgetcsv解析数据,而不是依赖字符串中没有逗号 您可以在读取csv1时为存款日期创建索引数组,并在读取csv2时简单地查找此索引。如果有匹配的日期,请比较金额并继续 大概是这样的:
// read csv1, store in array and create index
$data = array();
$fh = fopen($csv1, 'r');
while($row = fgetcsv($fh)) {
$data[] = $row;
$val = $row[$interestd_in];
$key = count($data) - 1;
$idx[$val][] = $key; // array containing all indices
}
fclose($fh);
// read csv2, lookup in index and process further
$fh = fopen($csv2, 'r');
while($row2 = fgetcsv($fh)) {
$val = $row2[$interest2];
if(!empty($idx[$val])) {
foreach($idx[$val] as $key) {
$row1 = $data[$key];
/*
do your further comparisons of these 2 data-lines
and output, if matches found
*/
}
}
}
fclose($fh);
要求:查找并记录与相应主记录匹配的交易记录 必须保留与主记录匹配的所有交易记录的列表 比较基于“日期”和金额。更新后,当您传递要使用的“列名”数组时,可以方便地允许当前行中的任何值 问题是,如果数组没有按要比较的键进行排序,那么这可能会非常昂贵 一种方法是生成一个“键”,该键对于每个“数据键字段”都是唯一的,但很容易生成,并且大小固定,便于比较 然后使用这些“键”生成原始记录的“已生成键”的查找数组 这样就不必提供要比较的字段的排序数据。但是,生成的查找数组必须适合内存 我决定对连接的数据键使用MD5哈希。在此应用中,碰撞的机会并不重要。MD5在生成唯一散列方面非常出色。它也很快 完成该工作的类: 解释 运行它的代码: 测试数据
要求:查找并记录与相应主记录匹配的交易记录 必须保留与主记录匹配的所有交易记录的列表 比较基于“日期”和金额。更新后,当您传递要使用的“列名”数组时,可以方便地允许当前行中的任何值 问题是,如果数组没有按要比较的键进行排序,那么这可能会非常昂贵 一种方法是生成一个“键”,该键对于每个“数据键字段”都是唯一的,但很容易生成,并且大小固定,便于比较 然后使用这些“键”生成原始记录的“已生成键”的查找数组 这样就不必提供要比较的字段的排序数据。但是,生成的查找数组必须适合内存 我决定对连接的数据键使用MD5哈希。在此应用中,碰撞的机会并不重要。MD5在生成唯一散列方面非常出色。它也很快 完成该工作的类: 解释 运行它的代码: 测试数据
您没有连接这些数据的密钥或id吗?如果两个交易的日期和金额相同,该怎么办?但对于你的问题——我想一种方法是将第二个foreach放到第一个foreach中——这可能是一种时间/资源密集型方法。但是你可以将每一行与每一行进行比较。或者你们两个。@Jurik,是的,我没有钥匙/身份证。你介意给我参考吗?是的,这就是我想要完成的。如果两个交易记录的日期和金额相同,则显示所有交易记录。请检查我的附加照片。谢谢。主文件是payment.csv。如果有匹配项,只需将每一行查找到transactions.csv即可。如果不是那么清楚的话,那就乌云密布
。一旦它们存储在单独的数组中,我会添加一个可以轻松检查的密钥。我会使用存款日期和金额的MD5散列。因此,传递主文件并生成密钥,使用哈希的密钥创建另一个数组$masterHash。现在,向下传递生成MD5哈希添加的事务文件,查看它是否存在于$masterHash中。如果是,你有一个匹配。这将是快速的,因为它只是两个连续的过程和查找开销。工作代码:-将很快发布答案-去喝咖啡:你没有连接这些数据的密钥或id?如果两个交易的日期和金额相同,该怎么办?但对于你的问题——我想一种方法是将第二个foreach放到第一个foreach中——这可能是一种时间/资源密集型方法。但是你可以将每一行与每一行进行比较。或者你们两个。@Jurik,是的,我没有钥匙/身份证。你介意给我参考吗?是的,这就是我想要完成的。如果两个交易记录的日期和金额相同,则显示所有交易记录。请检查我的附加照片。谢谢。主文件是payment.csv。如果有匹配项,只需将每一行查找到transactions.csv即可。如果不是很清楚的话,那就麻烦了。一旦它们存储在不同的数组中,我会添加一个我可以轻松检查的密钥。我会使用存款日期和金额的MD5散列。因此,传递主文件并生成密钥,使用哈希的密钥创建另一个数组$masterHash。现在,向下传递生成MD5哈希添加的事务文件,查看它是否存在于$masterHash中。如果是,你有一个匹配。这将是快速的,因为它只是两个连续的过程和查找开销。工作代码:-将很快发布答案-去喝咖啡:哇!谢谢你。希望能成功。现在就开始吧。我附上了照片。请查收。有可能吗?有可能在数组中显示/存储具有多个匹配的事务吗?示例:与交易1、3、5匹配的付款。。等等。目的是查看交易中付款的所有可能匹配项。是的,这是可能的,当您将$masterData[$key]['transaction']=array更改为$masterData[$key][]=array时,您可以将其存档。嘿,伙计,我正在尝试运行您的示例代码。其工作正常,但其他列表不会显示在阵列上。问题是使用md5数据和金额的密钥,用户可能有相同的日期和金额,因此密钥不是唯一的。你有办法解决这个问题吗?如果用户A、B和C具有相同的付款日期和金额键,则应显示相同的交易记录。希望收到你的来信。谢谢,哇!谢谢你。希望能成功。现在就开始吧。我附上了照片。请查收。有可能吗?有可能在数组中显示/存储具有多个匹配的事务吗?示例:与交易1、3、5匹配的付款。。等等。目的是查看交易中付款的所有可能匹配项。是的,这是可能的,当您将$masterData[$key]['transaction']=array更改为$masterData[$key][]=array时,您可以将其存档。嘿,伙计,我正在尝试运行您的示例代码。其工作正常,但其他列表不会显示在阵列上。问题是使用md5数据和金额的密钥,用户可能有相同的日期和金额,因此密钥不是唯一的。你有办法解决这个问题吗?如果用户A、B和C具有相同的付款日期和金额键,则应显示相同的交易记录。希望收到你的来信。谢谢。我刚刚遇到一些键相同的行不存在。问题在于关键日期和金额可以重复。如果两个或多个用户具有相同的日期和金额,则只有第一个用户会显示其他用户不会显示,因为密钥已存在。您能帮助我如何显示其他数据/用户吗?ThanksIt已经为匹配的主记录维护了类似的列表:我只是没有添加代码来显示它们。我将添加它并用新代码更新pastebin。很快,谢谢!你能逐行解释一下代码吗?其中一些但不是全部。我现在遇到的是,具有相同键的某些行不存在。问题在于关键日期和金额可以重复。如果两个或多个用户具有相同的日期和金额,则只有第一个用户会显示其他用户不会显示,因为密钥已存在。您能帮助我如何显示其他数据/用户吗?ThanksIt已经为匹配的主记录维护了类似的列表:我只是没有添加代码来显示它们。我将添加它并用新代码更新pastebin。很快,谢谢!你能逐行解释一下代码吗?其中一些,但不是全部。
later....
// !!!! You can pass the names of the fields to be used to generate the key
$match = new HashMatch($master,
$transaction,
array('whenDone', 'amount'));
$match->generateMatches();
// print output...
echo '<pre>Hash Master Records with multiple Matching Masters ... ', PHP_EOL;
print_r($match->getHashMatchedMasterList());
echo '</pre>';
Matching Master to Transaction...
Array
(
[key] => 296099e19b77aad413600a1e2f2cb3cd
[master] => Array
(
[0] => Array
(
[name] => John Matched
[whenDone] => 2016-04-01
[amount] => 12345
[email] => johnMatched@y.com
)
[1] => Array
(
[name] => Jane Matched
[whenDone] => 2016-04-01
[amount] => 12345
[email] => janeMatched@y.com
)
)
[transaction] => Array
(
[0] => Array
(
[name] => John Doe
[whenDone] => 2016-04-01
[amount] => 12345
[email] => johndoe@y.com
)
[1] => Array
(
[name] => micky mean
[whenDone] => 2016-04-01
[amount] => 12345
[email] => mickym@y.com
)
)
)
$master[] = array('name' => 'First last', 'whenDone' => '2016-03-03', 'amount' => 12000, 'email' => 'sample@y.com', );
$master[] = array('name' => 'John Matched', 'whenDone' => '2016-04-01', 'amount' => 12345, 'email' => 'johnMatched@y.com');
$master[] = array('name' => 'Jane Unmatched', 'whenDone' => '2016-05-02', 'amount' => 12345, 'email' => 'janeUnmatched@y.com');
$master[] = array('name' => 'Jane Matched', 'whenDone' => '2016-04-01', 'amount' => 12345, 'email' => 'janeMatched@y.com');
$transaction[] = array('name' => 'Mary Lamb', 'whenDone' => '2016-03-04', 'amount' => 12000, 'email' => 'maryl@y.com');
$transaction[] = array('name' => 'John Doe', 'whenDone' => '2016-04-01', 'amount' => 12345, 'email' => 'johndoe@y.com');
$transaction[] = array('name' => 'micky mean', 'whenDone' => '2016-04-01', 'amount' => 12345, 'email' => 'mickym@y.com');