2013-06-17 3 views
1

104 개의 필드가있는 CSV 파일이 있지만, mysql 데이터베이스에서 사용할 필드가 4 개만 있으면됩니다. 각 파일에는 약 백만 개의 행이 있습니다. 누군가가이 작업을 효율적으로 수행 할 수 있습니까? 각 줄을 배열로 읽는 것은 오랜 시간이 걸린다. 감사합니다.많은 수의 필드가있는 csv 파일 읽기

+0

fgets로 파일을 읽는 것이 더 빠르지 않습니까? 그렇게하면 한 번에 하나의 라인 만 메모리로 읽어 들일 수 있습니다. 얼마나 빨라지는지 확신 할 수 없으므로 답으로 쓰고 싶지는 않습니다.하지만 시도해 볼 가치가 있습니다. 그렇지 않으면, 나는 PHP와 함께하지 말라고 말하고 싶지만 - bash 스크립트 나 유사한 것을 사용하여 파일을 빨리 통과 한 다음 php를 사용하여 데이터베이스에 해당 값을 저장하십시오. –

+0

일부 스크립팅이 좋을 것입니다. 그걸 할 단계를 말해 줄 수 있어요? – user1605904

+0

가장 간단한 형태로, sed와 정규 표현식을 사용할 수 있습니다 :'sed s/expression/replacement/flags myfile.csv> newfile.csv' –

답변

0

모든 행을 전체적으로 읽어야합니다. 이것은 다음 레코드 (즉, 개행 문자)에 대한 구분 기호를 찾는 데 필요합니다. 읽지 않은 데이터는 버려두기 만하면됩니다. 예컨대는 :

$data = array(); 
$fh  = fopen('data.csv', 'r'); 
$headers = fgetcsv($fh); 

while ($row = fgetcsv($fh)) { 
    $row = array_combine($headers, $row); 
    $data[] = array_intersect_key($row, array_flip(array('foo', 'bar', 'baz'))); 

    // alternatively, if you know the column index, something like: 
    // $data[] = array($row[1], $row[45], $row[60]); 
} 

이 단지 는 열 푸, 바, 바즈을 유지하고 나머지는 버립니다. 파일 (fgetcsv)에서 읽는 은 대략 최대한 빨리 나타납니다. 더 빨리 처리해야하는 경우에는 임시로 메모리에 저장하지 않고도 필요없는 열을 건너 뛰는 고유 한 CSV 토크 나이저 및 구문 분석기를 구현해야합니다. 이 버그를 무료로 구현하는 데 필요한 개발 시간 대 성능 향상의 정도는 매우 논쟁의 여지가 있습니다.

간단한 엑셀 매크로는 불필요한 모든 열 (104 중에서 100) 초를 버릴 수 있습니다. 나는 비슷한 해결책을 찾고있다. Excel에서 한 번 파일이 열려 있기 때문이다

는 메모리에서 모든 데이터가 매우 신속하게 행동 할 수 있습니다. 정확한 비교를 위해 Excel에서 파일을 열 때 + 열을 삭제하는 데 걸리는 시간을 비교해야합니다. 이 아니라 단지이 열을 삭제합니다.