2010-08-05 24 views
5

Vì vậy, tôi có một tập tin CSV mà trông như thế này:Làm cách nào để phân tích cú pháp CSV thành mảng có giá trị đầu tiên là khóa?

12345, Here is some text 
20394, Here is some more text 

Làm thế nào tôi có thể chèn này vào một mảng trông như vậy

$text = "12345" => "Here is some text", 
     "20394" => "Here is some more text"; 

Đây là những gì tôi đang có để có được một số đơn giá trị dựa trên một lớp CSV

 if ($handle = fopen("$qid", "r")) { 

      $csvData = file_get_contents($qid); 
      $csvDelim = "\r"; 

      $qid = array(); 
      $qid = str_getcsv($csvData, $csvDelim); 

     } else { 

      die("Could not open CSV file."); 

     } 

Cảm ơn bạn đã trả lời nhưng tôi vẫn thấy một vấn đề tiềm ẩn. Với các giải pháp này, các giá trị sẽ không lưu trữ theo cách này:

$array[0] = 12345 
$array[1] = Here is some text 20394 
$array[2] = Here is some more text 

Nếu tôi thử điều này trên ví dụ csv ở trên, mảng sẽ được cấu trúc như thế nào?

+0

Làm dấu phẩy của xảy ra trong văn bản? – Sjoerd

+0

Dấu phân tách của bạn phải là '', '', không phải' "\ r" ' – meagar

+2

Những gì bạn yêu cầu ... nó không thể được thực hiện, máy tính không có khả năng ma thuật đen như vậy. Bạn sẽ cần phải viết vài nghìn dòng mã trong assembly và có ít nhất 16 lõi trong máy tính của bạn để thậm chí có thể thử nó. – MooGoo

Trả lời

10

Bạn có thể sử dụng fgetcsv() để đọc một dòng từ một tệp vào một mảng. Vì vậy, một cái gì đó như thế này:

$a = array(); 
$f = fopen(....); 
while ($line = fgetcsv($f)) 
{ 
    $key = array_shift($line); 
    $a[$key] = $line; 
} 
fclose($f); 
var_dump($a); 
+0

thay thế 'fopen' bằng 'fgetcsv' – Sarfraz

+0

+1 thanh lịch và hiệu quả – Artefacto

+0

@ Sarfaz: erm,' fgetcsv' vẫn yêu cầu xử lý từ 'fopen'? Hay đã từng có một cái 'fread' cần được thay thế? – Wrikken

0

Nếu bạn đang đọc một tập tin tôi có thể khuyên bạn sử dụng một cái gì đó giống như fgetcsv() này sẽ đọc từng dòng trong CSV vào một mảng chứa tất cả các cột như các giá trị.

http://at2.php.net/fgetcsv

0
$csv_lines = explode('\n',$csv_text); 
foreach($csv_lines as $line) { 
    $csv_array[] = explode(',',$line,1); 
} 

chỉnh sửa - dựa trên mã đăng sau câu hỏi ban đầu:

if ($handle = fopen("$qid", "r")) { 

     $csvData = file_get_contents($qid); 
     $csvDelim = "\r"; // assume this is the line delim? 

     $csv_lines = explode($csvDelim,$csvData); 
     foreach($csv_lines as $line) { 
     $qid[] = explode(',',$line,1); 
     } 

    } else { 

     die("Could not open CSV file."); 

    } 
+0

Điều này thực sự có thể làm các trick ... Tôi sẽ lấy lại cho bạn :) – ThinkingInBits

+0

Lỗi nghiêm trọng: [] nhà điều hành không được hỗ trợ cho các chuỗi trong C: \ xampp \ htdocs \ hint_updater \ index.php trên dòng 39 – ThinkingInBits

+0

Rất tiếc, haha , tốt, $ qid được sử dụng cho cả chuỗi và mảng, tôi không nhận thấy điều đó. Hãy thử redeclaring $ qid dưới dạng mảng trước vòng lặp "foreach" như bạn đã làm trong mã của mình $ csv_lines = explode ($ csvDelim, $ csvData); $ qid = array(); foreach ($ csv_lines là $ line) { $ qid [] = phát nổ (',', $ line, 1); } Có thể là tốt để làm $ qid_array thay vì là tốt để bạn không bị mất chuỗi tệp gốc. – clumsyfingers

0

Với tập tin mới của bạn với hai cột, $ qid nên trở thành một mảng với hai giá trị cho mỗi dòng.

$csvDelim = ","; 
$qid = str_getcsv($csvData, $csvDelim); 
$text[$qid[0]] = $qid[1]; 
3

Giả sử rằng các dòng đầu tiên trong file CSV chứa các tiêu đề cột, điều này sẽ tạo ra một mảng kết hợp sử dụng những tiêu đề cho dữ liệu của mỗi hàng:

$filepath = "./test.csv"; 
$file = fopen($filepath, "r") or die("Error opening file"); 
$i = 0; 

while(($line = fgetcsv($file)) !== FALSE) { 
    if($i == 0) { 
     $c = 0; 
     foreach($line as $col) { 
      $cols[$c] = $col; 
      $c++; 
     } 
    } else if($i > 0) { 
     $c = 0; 
     foreach($line as $col) { 
      $data[$i][$cols[$c]] = $col; 
      $c++; 
     } 
    } 
    $i++; 
} 

print_r($data); 
Các vấn đề liên quan