2011-10-06 46 views
5

Có một vài cách để đọc tệp CSV bằng PHP. Tôi đã sử dụng chức năng phát nổ để đặt mỗi dòng vào một mảng và sau đó phát nổ dấu phẩy và sử dụng cắt để xóa mọi dấu ngoặc kép khỏi dữ liệu. Đó là lộn xộn ...PHP đọc tệp csv hiệu quả

Trong PHP 5 có bây giờ fgetcsv và * str_getcsv * ... Tôi đoán đây là cách tốt nhất để đi về nó những ngày này vì vậy tôi đã đánh một số mã. .

$fp = fopen($csv_file['file_path'], 'r');  
while (($data = fgetcsv($fp, 0, "\r", '"', "\r")) !== FALSE) { 
    $num = count($data); 
    for ($c=0; $c < $num; $c++) { 
     print_r(str_getcsv($data[$c])); 
    } 
} 

Có vẻ như hoạt động nhưng có cách tiếp cận không an toàn hơn? Ví dụ: làm cho nó hoạt động cho dù ngắt dòng là \ n hoặc \ r ...

Bất kỳ đầu vào nào bạn có thể cung cấp đều tuyệt vời!

Trả lời

2

Điều này chuyển đổi CSV thành một mảng lồng nhau. Có thể dễ dàng hơn cho bạn để giải quyết:

<?php 
    /** 
    * 
    */ 
    function csv_entry_to_array(array $row) 
    { 
     $column_count = count($row); 
     $csv_column_values = array(); 

     // Loop through the columns of the current CSV entry and store its value 
     for ($column_index = 0; $column_index < $column_count; $column_index++) 
     { 
      // Store the value of the current CSV entry 
      $csv_column_values[] = $row[$column_index]; 
     } 

     // Return 
     return $csv_column_values;  
    } 

    /** 
    * @param string $input_file_name   Filename of input CSV 
    * @param boolean $include_header_in_output Flag indicating whether the first entry in the CSV is included in the output or not. 
    * @param integer $length      Must be greater than the longest line (in characters) to be found in the CSV file (allowing for trailing line-end characters). 
    *            It became optional in PHP 5. Omitting this parameter (or setting it to 0 in PHP 5.0.4 and later) the maximum line length is 
    *            not limited, which is slightly slower. 
    * @param string $delimeter     Set the field delimiter (one character only). 
    * @param string $enclosure     Set the field enclosure character (one character only). 
    * @param string $escape      Set the escape character (one character only). Defaults as a backslash. 
    * $return array        Nested indexed array representing the CSV. Empty array on error (e.g. input file missing, input file not a CSV). 
    */ 
    function csv_file_to_array($input_file_name, $include_header_in_output = TRUE, $length = 1000, $delimeter = ',', $enclosure = '"', $escape = '\\') 
    { 
     // NOTE: this attempts to properly recognize line endings when reading files from Mac; has small performance penalty 
     ini_set('auto_detect_line_endings', TRUE); 

     $csv_array = array(); 

     // Warnings are supressed, but that's OK since the code handles such warnings 
     if (($handle = @fopen($input_file_name, "r")) !== FALSE) 
     { 
      $row_counter  = 0; 

      // Iterate over the CSV entries 
      while (($row = fgetcsv($handle, $length, $delimeter, $enclosure, $escape)) !== FALSE) 
      {   
       if ($row_counter === 0 && $include_header_in_output === TRUE) 
       { 
        // This is the first row in the CSV and it should be included in the output 
        $csv_array[] = csv_entry_to_array($row);     
       } 
       else if ($row_counter > 0) 
       { 
        // This is a row in the CSV that needs to be stored in the return array 
        $csv_array[] = csv_entry_to_array($row); 
       } 

       $row_counter++; 
      } 

      // Close file handler 
      fclose($handle); 
     } 
     else 
     { 
      // Input file: some error occured 
      return array(); 
     } 

     return $csv_array; 
    } 
+0

Tôi cũng đã đề cập đến điều này với Mario ở trên nhưng tôi nghĩ có thể có điều gì đó sai trái với tệp CSV của tôi ... Đây là một mật khẩu của nó bensinclair.co/import.csv ... Khi tôi sử dụng tệp này với mã của bạn, nó sẽ xuất dữ liệu của tôi những gì xảy ra với mã marios ở trên img192.imageshack.us/img192/2483/screenshot20111006at123b.png Tôi đã tạo tệp CSV trong Microsoft Excel trên Mac. Tôi đang làm điều gì đó sai trái hoặc làm điều gì đó cần phải được điều chỉnh trong mã? –

+0

Tôi thấy sự cố. Sẽ sửa chữa. – StackOverflowNewbie

+0

Tôi đã cập nhật mã. Đã thêm 'ini_set ('auto_detect_line_endings', TRUE);'. Hãy thử một lần. – StackOverflowNewbie

6

Có chức năng đọc tệp theo dòng: file(), cũng hoạt động trên cả hai loại dòng.

Và phương pháp ngắn nhất để đọc trong file CSV toàn bộ là:

$data = array_map("str_getcsv", file($filename)); 

Không chắc gì $num = count() của bạn là gì.

+0

Xin chào Mario, cảm ơn bạn đã trả lời! Mã bạn đã cho tôi đặt mỗi ô vào một mảng thay vì mỗi dòng vào mảng riêng của nó. Vì vậy, bây giờ tôi có một mảng lớn với mỗi tế bào từ mọi dòng trong đó. Tôi có ý nghĩa không? Làm thế nào để tôi phá vỡ mỗi dòng vào mảng riêng của mình? –

+1

Đoạn mã trên sẽ cung cấp cho bạn một chuỗi '$ data [$ line] [$ row]' hai chiều, cấu trúc bảng thường được giả định. Không hoàn toàn chắc chắn những gì bạn muốn thay thế. - Nếu bạn chỉ muốn xem mỗi dòng một lần, sau đó sử dụng một foreach thay thế: 'foreach (file ($ fn) là $ line) {$ data = str_getcsv ($ line); } ' – mario

+0

Tôi nghĩ có thể đã xảy ra sự cố với tệp CSV của tôi ... Đây là một mật khẩu của nó http: //bensinclair.co/import.csv ... Khi tôi sử dụng tệp này với mã của bạn, nó sẽ xuất dữ liệu của tôi như thế này http : //img192.imageshack.us/img192/2483/screenshot20111006at123b.png –

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