【问题标题】:How to get CSV values based on unique column (if unique column found loop its some columns)如何根据唯一列获取 CSV 值(如果找到唯一列循环它的某些列)
【发布时间】:2014-09-24 20:48:49
【问题描述】:

我有一个包含逐行数据的 CSV 文件。场景是我的 2 列始终具有相同的值。

假设,如果在第 1 行中,第 0 列和第 1 列具有相同的值,则只需将其与我要循环的其他值一起存储在数组中。

在下一次迭代中,它会检查第 0 列和第 1 列的值是否已经存在于前一个数组中,因此循环第 1 列并将该列数据循环到新数组,直到从前面的行第 0 列和第 1 列具有不同的值。

这是 CSV 文件数据:

PickTicketNumber    OrderNumber LineItemUpc LineItemUnitPrice   LineItemQuantity                                                                                                                                                                                                    
218837  204127  LR8025BLKMD 58  4                                                                                                                                                                                                   
218837  204127  LR8025BLKLG 58  3                                                                                                                                                                                                   
218837  204127  LR8475HEASM 54  1                                                                                                                                                                                                   
218837  204127  LR8770ROYLG 53  1                                                                                                                                                                                                   
218838  204128  LR8475HEAXS 54  1                                                                                                                                                                                                   
218838  204128  LR8475HEASM 54  2                                                                                                                                                                                                   
218838  204128  LR8475HEAMD 54  2                                                                                                                                                                                                   
218838  204128  LR8475HEALG 54  1                                                                                                                                                                                                   
218838  204128  LR8917BLKXS 58  1                                                                                                                                                                                                   
218838  204128  LR8917BLKSM 58  1                                                                                                                                                                                                   
218838  204128  LR8917BLKMD 58  1                                                                                                                                                                                                   
218838  204128  LR8917BLKLG 58  1                                                                                                                                                                                                   
218838  204128  LR6382BLKXS 48  1                                                                                                                                                                                                   
218838  204128  LR6382BLKSM 48  2                                                                                                                                                                                                   
218838  204128  LR6382BLKMD 48  2                                                                                                                                                                                                   
218838  204128  LR6382BLKLG 48  1                                                                                                                                                                                                   
218838  204128  LR8475BLKSM 54  2                                                                                                                                                                                                   
218838  204128  LR8475BLKMD 54  2                                                                                                                                                                                                   
218838  204128  LR8475BLKLG 54  1                                                                                                                                                                                                   
218839  204130  LR8878HEAXL 63  1

这里很清楚,218837 204127 存在 4 次,所以我只想要一次并循环它的 LineItemUpc LineItemUnitPrice LineItemQuantity。

在最终结果中,我希望以这种方式查看结果:

218837  204127 

仅一次,如果它再次存在于下一行中,则再次循环其 LineItemUpc LineItemUnitPrice LineItemQuantity。意味着我想要的循环:

LR8025BLKMD 58  4                                                                                                                                                                                                   
LR8025BLKLG 58  3                                                                                                                                                                                                   
LR8475HEASM 54  1                                                                                                                                                                                                   
LR8770ROYLG 53  1

其他元素也一样。

表示一个 PickTicketNumber OrderNumber 并在接下来的具有相同 PickTicketNumber OrderNumber 的行中循环它们的所有值,直到并且除非新的 PickTicketNumber OrderNumber 出现新的 PickTicketNumber OrderNumber。

最后我的最终结果是:

<reference>218837 / 204127</reference>
            <line>LR8025BLKMD</line>
                <price>58<price>
                <qty>3<qty>
            <line>LR8025BLKLG</line>
                <price>58<price>
                <qty>1<qty>
            <line>LR8475HEASM</line>
                <price>54<price>
                <qty>1<qty>
            <line>LR8770ROYLG</line>
            <price>53<price>
            <qty>1<qty>

【问题讨论】:

  • 你试过了吗?
  • 目前还不清楚最终的结果是什么。它会是一个多维数组吗?你能把数组贴在这里它最终应该是什么样子吗?
  • @vlzvl 是的,我确实先尝试了自己,因此我把我的逻辑放在这里。我正在使用数组,但一点运气都没有。
  • 你已经有任何代码了吗?也请在这里发布。
  • 我已经发布了我的最终结果。谢谢

标签: php csv fgetcsv


【解决方案1】:

我仍然不确定你想要什么作为最终结果,但我希望这能让你继续前进:

<?php

$result = array();

if (($handle = fopen("test.csv", "r")) !== FALSE) {
    $row = 0;
    while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
        // Create a unique key based on the first two fields
        $unique = $data[0] . '-' . $data[1];

        // Test if this key already exists in the array. If not, create it.
        if (!array_key_exists($unique, $result)) {
            $result[$unique] = array(
                'PickTicketNumber' => $data[0],
                'OrderNumber' => $data[1],
                'Data' => array(),
            );
        }

        // Append the actual data (all columns except the first two)
        $result[$unique]['Data'][] = array_slice($data, 2);
    }
    fclose($handle);
}

echo "<pre>".print_r($result,1)."</pre>";

这应该是这样的:

Array(
    '218837-204127' => Array(
        'PickTicketNumber' => 218837,
        'OrderNumber' => 204127,
        'Data' => Array(
            array('LR8...MD',58,4),
            array('LR80..LG',58,3),
            etc.
        )
    ),
    '218838-204128' => Array(
        etc.
    ),
)

我希望这能回答你的问题。

【讨论】:

  • 非常感谢,一个问题。没有输出第一条记录:LR8025BLKMD 58 4
  • 表示跳过第一个结果。它应该打印 4 时只打印 3。
  • 那是因为我假设第一条记录是列名。您必须删除说明“跳过第一行”的行。 (我会编辑我的帖子)
  • 完美处理。你让我印象深刻的人。非常感谢你。我需要这样的结果。
  • 希望给你 10+ 票。 :) 你怎么写得这么好?我想做一个优秀的程序员,但我还没有做到。
猜你喜欢
  • 2014-11-09
  • 1970-01-01
  • 2019-05-26
  • 1970-01-01
  • 2016-08-26
  • 1970-01-01
  • 1970-01-01
  • 2021-07-20
  • 2021-10-03
相关资源
最近更新 更多