【问题标题】:I need to compare two columns of two differences file csv我需要比较两个差异文件csv的两列
【发布时间】:2018-05-14 17:57:02
【问题描述】:

我是 PHP 语言新手,我有 2 个 csv 文件,其中包含:前 2 列,第一列带有一些国家/地区前缀,第二列带有对应国家/地区的名称。 第二个有 2 列,第一个有电话号码,第二个通讯国。如果我发现前缀匹配,我需要比较这两个文件,我需要删除这个号码,并将其余电话号码添加到另一个文件中。例如:

第一个文件 x.csv 第二个文件 y.csv 前缀国家电话号码 4474 英国 英国 44793245683... 347466 西班牙 西班牙 34746689211345 3278比利时比利时324568845212..... 瑞士4189544562131... 英国 4474321546588464... 意大利 39324566546548345 英国 4478564684151...

所以我想在另一个 fil z.csv 中输出这个输出:

country     phone number
UK          44793245683...

Belgium     324568845212.....
Switzerland 4189544562131...
Italy       39324566546548345
UK          4478564684151... 

这意味着在这个数字中找到了匹配的前缀:

Country     Phone NUmber      Match Prefix
Spain       34746689211345    347466
UK          4474321546588464  4474 

【问题讨论】:

  • 你需要先学习如何打开csv文件,然后开始阅读行,然后你可以比较
  • 这个问题太宽泛了,几乎就像在问“给我写代码”。请阅读文档,如果失败,请使用代码示例而不是要求针对特定问题提出更具体的问题。
  • 这可以通过shell_exec 使用一个awk 命令来完成。
  • 请阅读此“How do I ask a good question?

标签: php csv


【解决方案1】:

您可以使用fgetcsv读取csv文件fputcsv写入csv文件

例如:

$x = fgetcsv('x.csv');
$y = fgetcsv('y.csv');
$z = [];
foreach $x as $row
  if $row[1] $y then add $row in $z
fputcsv('z.csv', $z);

【讨论】:

    【解决方案2】:

    以下是示例文件和用法的答案:

    文件一:

    root@dib:~# cat 1.csv
    prefix  country
    4474    UK
    347466  Spain
    3278    Belgium
    

    文件二:

    root@dib:~# cat 2.csv
    country     phone number
    UK          44793245683...
    Spain       34746689211345
    Belgium     324568845212.....
    Switzerland 4189544562131...
    UK          4474321546588464...
    Italy       39324566546548345
    UK          4478564684151...
    

    PHP 脚本:

    root@dib:~# cat find_numbers.php
    <?php
    $file1 = $argv[1];
    $file2 = $argv[2];
    
    // Get an array of each line of the first file.
    $prefix_contry = explode("\n", file_get_contents($file1));
    
    print "Country\t Phone NUmber\t Match Prefix\n";
    
    foreach($prefix_contry as $prefix_line) {
        // Extract numbers from begging of each line.
        if(preg_match('/^([0-9]+)/', $prefix_line, $prefix_matches)) {
    
            if($file = fopen($file2, "r")) {
    
                // Loop through second file line by line...
                while(($line = fgets($file)) !== false) {
                    $line = rtrim($line);
    
                    // Pull out number from second file.
                    if(preg_match('/([0-9]+)/', $line, $matches)) {
    
                        // Check to see if number begins with prefix.
                        if(preg_match("/^{$prefix_matches[1]}/", $matches[1])) {
                            print("$line\t{$prefix_matches[1]}\n");
                        }
                    }
                }
                fclose($file);
            } else {   print "Couldn't open file.";   }
        }
    }
    
    ?>
    

    试运行:

    root@dib:~# php find_numbers.php 1.csv 2.csv
    Country  Phone NUmber    Match Prefix
    UK          4474321546588464... 4474
    Spain       34746689211345      347466
    

    【讨论】:

    • // 检查数字是否以前缀
       if(preg_match("/^{$prefix_matches[1]}/", $matches[1])) { print("$行\t{$prefix_matches[1]}"); }
      从这些条件我需要“else”部分,但是当我打印出来时,我面临着太多的组合,甚至是匹配前缀的组合
    • @Ervis,你能改写那句话吗?你是什​​么意思你需要 else 部分?
    • 当你控制时 "// 检查数字是否以前缀开头。"在此我需要查看与前缀不匹配的所有结果。例如:44793245683...这个号码甚至没有匹配,但是当我使用大量前缀和号码时,我面临着大量重复的电话号码组合。
    • 您应该改写最初的问题,因为您的示例输出与您现在要求的不匹配。此外,如果您想要不匹配的内容,您可以只将匹配项打印到文件中,然后使用grep -v -f &lt;output_file&gt; &lt;phone_list_file&gt; 它将删除与输出文件匹配的任何数字,从而为您提供“不来一场比赛”
    • 此外,您可以使用 shell 命令比使用 PHP 更轻松地完成所有这些操作。
    猜你喜欢
    • 2014-06-08
    • 1970-01-01
    • 1970-01-01
    • 2021-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多