2011-01-19 10 views
3

두 개의 큰 CSV 파일을 PHP로 병합하고 싶습니다. 이 파일은 너무 커서 한 번에 메모리에 넣을 수 없습니다. 의사, 나는 이런 식으로 뭔가 생각할 수 :PHP로 두 개의 큰 CSV 파일 병합

for i in file1 
    file3.write(file1.line(i) + ',' + file2.line(i)) 
end 

을하지만 fgetcsv을 사용하여 파일을 통해 반복하고있을 때, 그것으로 전체를로드하지 않고 내가 특정 파일에서 라인 n을 잡아 얼마나 정말 분명하지 않다 먼저 메모리.

아이디어가 있으십니까?

편집 : 두 파일 각각에 동일한 줄 수가 있으며 일대일 관계가 있음을 잊어 버렸습니다. 즉, file1의 62,324 행은 file2의 62,324 행과 함께 표시됩니다.

답변

4

확실하지 어떤 운영 체제를 당신이 paste 명령을 사용하여 리눅스를 사용하는 경우에있어, 그러나 아마 훨씬 더 쉽다 PHP에서 이것을 시도하는 것보다. 이 가능한 솔루션이며 당신이 절대적으로 PHP에서 그것을 할 필요가없는 경우

, 당신은 다음을 시도해 볼 수도 있습니다 :

paste -d ',' file1 file2 > combined_file 
+0

그래! 굉장해! 나는 이와 같은 솔루션을 좋아합니다. 나는 그것을 시도하고 그것은 효과가있다. –

0

내가 생각하기에이 솔루션은 각 줄 (그리고 필요한 경우 일종의 키)에 대한 첫 줄 시작을 매핑 한 다음 fread와 fwrite를 사용하여 새 CSV를 만듭니다 (이제 각 줄의 시작과 끝을 알 수 있습니다. 그래서 우리는 단지

또 다른 방법은 fgets 기능을 살펴보십시오 새로운 CSV

3

의 뒤쪽으로 가능한 경우 (MySQL의에 넣어)하는 것입니다) 추구하고 읽을 필요가 없다. 각 파일의 한 줄을 읽고 처리하고 새 파일에 기록한 다음 파일 끝에 도달 할 때까지 다음 줄로 이동할 수 있습니다.

PHP: fgets

특별히 PHP 가이드 라인하여 파일 읽기 라인 예 # 1이라는 예를 본다. fgets 함수의 반환 값을 기록하는 것도 중요합니다. 파일에서 읽기 1 바이트 에 의해 핸들 지적 -

는 최대 길이의 문자열을 반환합니다. 에 더 이상 데이터가 없으면 파일 포인터에서 읽습니다. FALSE 이 반환됩니다.

따라서 FALSE을 반환하지 않으면 처리 할 줄이 더 있음을 알고 있습니다.

1

fgets()을 사용하여 한 번에 각 파일에서 한 줄씩 읽으십시오.

3

fgets()을 사용할 수 있습니다.

$file1 = fopen('file1.txt', 'r'); 
$file2 = fopen('file2.txt', 'r'); 
$merged = fopen('merged.txt', 'w'); 

while (
    ($line1 = fgets($file1)) !== false 
    && ($line2 = fgets($file2)) !== false) { 

    fwrite($merged, $line1 . ',' . $line2); 
} 

fgets() 파일에서 한 줄을 읽습니다. 보시다시피,이 코드는 두 파일 모두에서 병합 된 행을 세 번째 파일에 쓰면서 동시에 사용합니다.여기에 수동 :

http://php.net/fgets

http://php.net/fopen

http://php.net/fwrite