2011-12-03 2 views
1

와 CSV 파일 : 파이로쓰기 I는 다음과 같이를 CSV 파일에 쓰기 배열을 작성하는 간단한 함수를 사용하고 PHP

function writeToCSV($array) { 
    $fp = fopen('programmes.csv', 'a'); 
    fputcsv($fp, $array); 
    fclose($fp); 
} 

간단한. 그러나 어쨌든 포인터가있는 라인 번호를 아는 것이 있습니까? 왜냐하면 1000 줄 이후에 새로운 파일에 쓰기를 시작할 수 있기를 원하기 때문입니다. 왜? 나중에 메모리 제약 조건으로 데이터베이스로 가져올 수 있어야하고 15000 줄의 CSV 파일을 구문 분석 할 수 있어야합니다.

답변

3
function writeToCSV($array) { 
    $i = 1; 
    $j = 1; 
    $fp = fopen('programmes' . $j . '.csv', 'a'); 
    foreach($array as $fields) { 
     if ($i % 1000 == 0) { 
      fclose($fp); 
      $fp = fopen('programmes' . $j . '.csv', 'a'); 
      $j = $j + 1; 
     } 
     fputcsv($fp, $fields); 
     $i = $i + 1; 
    } 
    fclose($fp); 
} 
+0

Hehe, 꽤 내 머리에 묘사처럼 복잡하지 =) 이것 역시 내가 원하는대로 작동합니다. – Marcus

0

이 시도 :

count(file('programmes.csv')); 

이 파일에 당신에게 줄 수를 줄 것이다.

+1

그것의 매우 느린 동작. –

+0

@Shiplu 오 그래, 나를 상기시켜 주셔서 감사합니다) – Jeune

0

이 작동하는지 나는 시도하지 않은,하지만 난 이런 짓을 할 것이다 :

<?php 
function writeToCSV($array) { 
    // count lines in the current file 
    $linecount = 0; 
    $fh = fopen('programmes.csv','rb') or die("ERROR OPENING DATA"); 
    while (fgets($fh) !== false) $linecount++; 
    fclose($fh); 

    $aSize = sizeof($array); 
    if (($linecount + $aSize) > 1000) { 
    // split array 
    $limit = 1000 - $linecount; 
    $a = array_slice($array, 0, $limit); 
    $b = array_slice($array, $limit); 
    // write into first file 
    $fp = fopen('programmes.csv', 'a'); 
    foreach($a as $field) fputcsv($fp, $field); 
    fclose($fp); 

    // write into second file 
    $fp = fopen('programmes2.csv', 'a'); 
    foreach($b as $field) fputcsv($fp, $field); 
    fclose($fp); 
    } else { 
    $fp = fopen('programmes.csv', 'a'); 
    $idx = 0; 
    while ($linecount < 1000) { 
     // fill the file to the 1000 lines 
     fputcsv($fp, $array[$idx]); 
     ++$linecount; 
     ++$idx; 
    } 
    fclose($fp); 

    if ($idx != $aSize) { 
     // create new file 
     $fp = fopen('programmes.csv', 'a'); 
     while ($idx< $aSize) { 
     // fill the file to the 1000 lines 
     fputcsv($fp, $array[$idx]); 
     ++$idx; 
     } 
     fclose($fp); 
    } 
    } 
} 
?>