2014-09-24 6 views
0

행 데이터가있는 CSV 파일이 있습니다. scenerio 내 열의 2 항상 같은 값을 가지고있다.고유 열을 기반으로 CSV 값을 얻는 방법 (고유 열이 일부 열을 루프하는 경우)

행 1에서 열 0과 열 1의 값이 같으면 루프 할 다른 값을 먼저 배열에 저장하면됩니다.

다음 반복에서 열 0 및 열 1 값이 이전 배열에 이미 존재하는지 확인하여 첫 번째 열과 그 열 데이터를 앞의 행에서 0이 될 때까지 새로운 열로 반복합니다. 218,837 204,127 4 시간 그래서 난 단순히 한 번 루프의 LineItemUpc LineItemUnitPrice LineItemQuantity를 원하는 존재, 여기의 명확한으로

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 

:

다음은 CSV 파일 데이터입니다. 나는 결과이 방법을보고 싶다 최종 결과에서

:

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> 
+0

시도해 보셨습니까? –

+0

최종 결과가 무엇인지는 명확하지 않습니다. 그것은 다차원 배열일까요? 결국 여기에 배열을 게시 할 수 있습니까? – vrijdenker

+0

@vlzvl 예 처음에 나 자신을 시도 했으므로 논리를 여기에 넣었습니다. 배열을 사용했지만 행운은 전혀 없습니다. –

답변

0

난 아직도 당신이 당신의 최종 결과로 원하는 모르겠지만, 나는 이것이 당신이가는 할텐데 :

<?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. 
    ), 
) 

답변을 드리겠습니다.

+0

감사합니다. 한 가지 문제가 있습니다. 첫 번째 레코드를 출력하지 않았습니다 :'LR8025BLKMD 4' –

+0

은 첫 번째 결과를 건너 뛰는 것을 의미합니다. 그것은 4 일 때 단지 3을 인쇄합니다. –

+0

첫 번째 레코드가 컬럼 이름이라고 가정했기 때문입니다. "첫 줄 건너 뛰기"라는 줄을 지워야합니다. (나는 나의 지위를 편집 할 것이다) – vrijdenker