2013-05-04 34 views
5

Tôi có tệp CSV lớn. Tôi muốn tách tệp này thành các tệp riêng biệt dựa trên giá trị trong một trong các trường.Làm thế nào tôi có thể chia nhỏ tệp CSV bằng PHP?

Đây là những gì tôi đã làm. Sử dụng fgetcsv tôi chuyển đổi CSV thành một mảng và sử dụng in_array, tôi kiểm tra nội dung và hiển thị nếu nó chứa chuỗi trong mảng.

Tôi sẽ nhận chuỗi so sánh từ một tệp văn bản khác theo tuần tự để kiểm tra xem nó có được chứa trong csv hay không. Trong trường hợp này tôi đã chỉ định nó là "Thử nghiệm".

Dưới đây là các mã:

if (($handle = fopen("test.csv", "r")) !== FALSE) { 
     while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) { 

      if(in_array("Testing", $data)) 
      { 
       var_dump($data); 
      } 
     } 

     fclose($handle); 
    } 

này đang làm việc, nhưng bây giờ tôi bị mắc kẹt. Làm cách nào để viết $data vào một tệp CSV khác? Hoặc là có một cách tốt hơn để làm điều này?

+0

liên quan: http://stackoverflow.com/questions/9645699/copy-file-content-to-another-file – Gordon

Trả lời

6

Nó thực sự khá đơn giản và nếu chuỗi chỉ có được trên đường dây, bạn thậm chí không cần fgetcsv. Chỉ cần

$srcFile = new SplFileObject('test.csv'); 
$destFile = new SplFileObject('new.csv', 'w+'); 
foreach ($srcFile as $line) { 
    if (strpos($line, 'testing') !== FALSE) { 
     $destFile->fwrite($line); 
    } 
} 

Điều này sẽ tạo hai đối tượng tệp. Người đầu tiên giữ nội dung của tệp nguồn của bạn. Cách thứ hai tạo một tệp mới cho các dòng chứa chuỗi tìm kiếm của bạn. Sau đó, chúng tôi chỉ lặp qua từng dòng và kiểm tra xem chuỗi tìm kiếm có tồn tại hay không. Nếu vậy, chúng tôi ghi nó vào tập tin đích.

Tệp nguồn sẽ không được chạm theo cách này. Nếu bạn muốn có một tệp với chuỗi tìm kiếm và một tệp không có, chỉ cần tạo một SplFileObject thứ ba và thêm một khối khác vào nếu viết dòng đó vào đó. Cuối cùng, xóa tệp csv nguồn.

1

Bạn phải làm một số điều khó khăn tôi đang cung cấp một số ý tưởng cơ bản để làm như vậy, đây là mã:

//opening file 
if ($fp = fopen('log.csv', 'r')) { 
    $line_number = 0; 

    //loop for Reading file as line by line csv file 
    while ($line = fgetcsv($fp, 0, ';')) { 
    if ($line_number++ == 0) { 
     continue; 
    } 

    //array data string to make possible to provide file name 
    //according to column name required 
    $date = explode(' ', $line[0]); 

    //Change the column name according to your needs 
    $file = $date[0] .'.log'; 

    file_put_contents(
     //change the folder name according to your needs 
     'monthly/'. $file, 
     //printing data in appended file 
     implode(';', $line) ."\n", 
     FILE_APPEND 
    ); 
    } 

    //closing file 
    fclose($fp); 
} 

Nó đọc CSV dòng tập tin bằng cách dòng, chiết xuất ngày một phần từ cột đầu tiên và tạo ra tập tin mới và nối dữ liệu vào nó.

Lưu ý:

thư mục "hàng tháng" phải ghi

+0

CÓ THỂ phức tạp hơn cần phải là – Gordon

+0

đó là cách duy nhất để tách tệp lớn mà tôi nghĩ – Vineet1982

Các vấn đề liên quan