2009-09-03 46 views

Trả lời

32

Bắt đầu từ PHP 5.3, bạn có thể sử dụng str_getcsv() để đọc các dòng riêng lẻ bằng cách sử dụng các dấu tách khác nhau.

$someCondition = someConditionToDetermineTabOrComma(); 

$delimiter = $someCondition ? "," : "\t"; 

$fp = fopen('mydata.csv', 'r'); 

while (!feof($fp)) 
{ 
    $line = fgets($fp, 2048); 

    $data = str_getcsv($line, $delimiter); 

    doSomethingWithData($data); 
}        

fclose($fp); 
+0

Tôi đã đến giải pháp tương tự. Tôi đọc tệp và tìm kiếm tab trong đó; nếu không tìm thấy tôi giả định rằng dấu phân cách là dấu phẩy. Sau đó dùng getcv làm phiên bản php là 5.2. Mặc dù tôi thấy một số sai sót trong điều này, tôi không thể nghĩ ra bất cứ điều gì tốt hơn. – veli

+0

Có thể đếm các tab và dấu phẩy (và các dấu phân cách tiềm năng khác) trên dòng đầu tiên, sau đó so sánh chúng với dòng thứ hai và cứ như vậy. Cho dù nhất quán nhất là dấu phân cách có khả năng của bạn. Một giải pháp vượt qua hai, thật không may, nhưng đó thường là cách khi bạn có một ẩn số. – Rikki

0

Đọc toàn bộ tệp hoặc xếp từng dòng và chia nhỏ tệp bằng cách chia nhỏ.

Ở đó bạn có thể bao gồm một regex với các dấu phân cách tùy ý. Tôi đã không PHP ở đây để kiểm tra một tuyên bố, nhưng php.net -> tìm kiếm cho split(). Ở đó bạn cũng có một bình luận liên quan đến regex.

+0

Nhưng đó phương pháp sẽ loại bỏ các chức năng bao vây của getcsv, có khả năng đánh bại mục đích của tất cả nhưng đơn giản nhất của các file csv. – dimo414

0

bạn có thể thử explode

explode (string $delimiter , string $string [, int $limit ]); 
+0

Trong tệp được phân tách bằng dấu phẩy, có thể có dấu phẩy bên trong dấu ngoặc kép không được coi là dấu phân cách. Đó là lý do tại sao tôi muốn sử dụng getscv, vì nó xử lý đúng cách. – veli

+0

Điều này vẫn là một giải pháp khả thi miễn là bạn nhận thức được dữ liệu bạn đang làm việc. Ngoài ra dữ liệu thường là định dạng csv là báo giá kép đủ điều kiện - điều này ngăn các vấn đề phát nổ. Không xứng đáng với một cuộc bỏ phiếu xuống imo. Mã này cũng rất phổ biến trong tự nhiên để phân tích cú pháp dữ liệu CSV ... – Radmation

9

Bạn có thể chỉ định một dấu phân cách cho fgetcsv(). Đây là một ví dụ về đọc file phân định theo tab

while (($data = fgetcsv($handle, 1000, "\t")) !== FALSE) { 
    ... 
} 
+0

Có, nhưng nó cũng có thể là tệp csv. Vấn đề là làm thế nào để nói chắc chắn nếu nó là csv hoặc tab delemited. – veli

2

Dưới đây là một ví dụ mà sẽ đọc mydata.txt lĩnh vực CSV

$tab = "\t"; 

$fp = fopen('mydata.txt', 'r'); 

while (!feof($fp)) 
{ 
    $line = fgets($fp, 2048); 

    $data_txt = str_getcsv($line, $tab); 

    //Get First Line of Data over here 
    print_r($data_txt); 
    exit; 
}        

fclose($fp); 
+0

Đây là một trong những tốt đẹp nhất. –

0

Đây là chức năng mà tôi thêm vào thư viện tiện ích của tôi để sử dụng trong tương lai. Tôi lấy nó từ NSSec's answer.

Giải pháp này cho phép bạn chỉ định xem bạn có muốn sử dụng dòng đầu tiên làm khóa cho mảng hay không. Tôi có lẽ sẽ thêm khả năng để vượt qua một mảng được sử dụng cho các phím cho tham số $ first_line_keys tại một số điểm.

/** 
* Converts a CSV file into an array 
* NOTE: file does NOT have to have .csv extension 
* 
* $file - path to file to convert (string) 
* $delimiter - field delimiter (string) 
* $first_line_keys - use first line as array keys (bool) 
* $line_lenght - set length to retrieve for each line (int) 
*/ 
public static function CSVToArray($file, $delimiter = ',', $first_line_keys = true, $line_length = 2048){ 

    // file doesn't exist 
    if(!file_exists($file)){ 
     return false; 
    } 

    // open file 
    $fp = fopen($file, 'r'); 

    // add each line to array 
    $csv_array = array(); 
    while(!feof($fp)){ 

     // get current line 
     $line = fgets($fp, $line_length); 

     // line to array 
     $data = str_getcsv($line, $delimiter); 

     // keys/data count mismatch 
     if(isset($keys) && count($keys) != count($data)){ 

      // skip to next line 
      continue; 

     // first line, first line should be keys 
     }else if($first_line_keys && !isset($keys)){ 

      // use line data for keys 
      $keys = $data; 

     // first line used as keys 
     }else if($first_line_keys){ 

      // add as associative array 
      $csv_array[] = array_combine($keys, $data); 

     // first line NOT used for keys 
     }else{ 

      // add as numeric array 
      $csv_array[] = $data; 

     } 

    } 

    // close file 
    fclose($fp); 

    // nothing found 
    if(!$csv_array){ 
     return array(); 
    } 

    // return csv array 
    return $csv_array; 

} // CSVToArray() 
0
$filePath = "somefile.txt"; 
$delimiter = "\t"; 

$file = new \SplFileObject($filePath); 
while (!$file->eof()) { 
    $line = $file->fgetcsv($delimiter); 
    print_r($line); 
} 
+0

Vui lòng thêm một số giải thích cho câu trả lời của bạn để làm cho nó có giá trị hơn cho những người dùng khác. – wmk

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