2011-03-28 18 views
10

Chcę odczytać plik .csv w PHP i umieścić jego zawartość w bazie danych. Napisałem poniższy kod:Czytanie pliku .csv w php

$row = 1; 
$file = fopen("qryWebsite.csv", "r"); 
while (($data = fgetcsv($file, 8000, ",")) !== FALSE) { 
    $num = count($data); 
    $row++; 
    for ($c=0; $c < $num; $c++) { 
     echo $data[$c] . "\n";}} 
fclose($file); 

Nie dostaję żadnego błędu, ale nie pokazuje mi wyniku.

Odpowiedz

17

Używam parseCSV klasę do odczytu danych z plików CSV. Może dać większą elastyczność w czytaniu pliku csv.

+5

Pssst: http://php.net/splfileobject – hakre

+1

pssst prawie rok później znalazłem twój [blog] (http://hakre.wordpress.com/2010/07/25/parsing-csv-files-with-php -spl-style /) – HenryW

5

ten nie został przetestowany ... ale coś takiego powinno wystarczyć:

$row = 1; 
if (($handle = fopen("xxxxxxxxx.csv", "r")) !== FALSE) { 
    while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) { 
     $num = count($data); 
     echo "<p> $num fields in line $row: <br /></p>\n"; 
     $row++; 
     for ($c=0; $c < $num; $c++) { 
      $blackpowder = $data; 
      $dynamit = implode(";", $blackpowder); 
      $pieces = explode(";", $dynamit); 
      $col1 = $pieces[0]; 
      $col2 = $pieces[1]; 
      $col3 = $pieces[2]; 
      $col4 = $pieces[3]; 
      $col5 = $pieces[5]; 
      mysql_query(" 
       INSERT INTO `xxxxxx` 
        (`xxx`,`xxx`,`xxx`,`xxxx`,`xxx`) 
       VALUES 
        ('".$col1."','".$col2."','".$col3."','".$col4."','".$col5."') 
      "); 
     } 
    } 
} 
+0

sensu. Dlaczego nie skorzystać z "LOAD DATA", które może obsłużyć CSV z wykorzystaniem "TERMINATED BY" –

+1

@Gary, "LOAD DATA" jest często wyłączone na współdzielonym hostingu z powodu możliwego zagrożenia bezpieczeństwa. – Charles

+0

@Gary & Charles i podjąłem jego próbę –

4
$fp = fopen('ReadMe.csv','r') or die("can't open file"); 
print "<table>\n"; 
while($csv_line = fgetcsv($fp,1024)) { 
    print '<tr>'; 
    for ($i = 0, $j = count($csv_line); $i < $j; $i++) { 
     print '<td>'.$csv_line[$i].'</td>'; 
    } 
    print "</tr>\n"; 
} 
print '</table>'; 
fclose($fp) or die("can't close file"); 

More Details

+0

Tak, to jest również dobre. –

1

Spróbuj to ....

W PHP jest często przydatna jest w stanie odczytać pliku CSV i dostępu jest to dane. W tym miejscu przydatna jest funkcja fgetcsv(), która odczyta każdą linię pliku CSV i przypisze każdą wartość do ARRAY. Możesz zdefiniować separator w funkcji, a także zapoznać się z dokumentami PHP dla fgetcsv(), aby uzyskać więcej opcji i przykładów.

function readCSV($csvFile){ 
     $file_handle = fopen($csvFile, 'r'); 
     while (!feof($file_handle)) { 
      $line_of_text[] = fgetcsv($file_handle, 1024); 
     } 
     fclose($file_handle); 
     return $line_of_text; 
    } 


    // Set path to CSV file 
    $csvFile = 'test.csv'; 

    $csv = readCSV($csvFile); 
    echo '<pre>'; 
    print_r($csv); 
    echo '</pre>'; 
0

Możesz wypróbować poniższy kod. Działa idealnie dla mnie. Mam komentarz, aby uczynić go bardziej zrozumiałym. Możesz skorzystać z tego kodu.

<?php 

//display error message if any 
ini_set('display_startup_errors',1); 
ini_set('display_errors',1); 
error_reporting(-1); 

//openup connection to database 
include('dbconnection.php'); 

//open csv file 
if (($handle = fopen("files/cities.csv", "r")) !== FALSE) { 

    $flag = true; 
    $id=1; 

    //fetch data from each row 
    while (($data = fgetcsv($handle, ",")) !== FALSE) { 
     if ($flag) { 
      $flag = false; 
      continue; 
     } 

     //get data from each column 
     $city_id  = $data[0]; 
     $country_name = $data[1]; 
     $city_name = $data[2]; 
     $state_code = $data[3]; 

     //query to insert to database 
     $sql = "INSERT IGNORE INTO `DB_Name`.`cities` 
       (`id`,`city_id`, country_name`, `city_name`,`state_code`) 
       VALUES 
       ('$id','$city_id','$country_name','$city_name','$state_code')"; 

     echo $sql; 

     //execute the insertion query 
     $retval = mysql_query($sql, $conn); 

     if($retval == false) 
     { 
      die('Could not enter data: ' . mysql_error()); 
     } 

     echo "<p style='color: green;'>Entered data having id = " .$id. " successfully</p><br>"; 
     $id++; 
    } 

    echo "<br><p style='color: orange;'>Congratulation all data successfully inserted</p>"; 

    fclose($handle); 
} 

//close the connection 
mysql_close($conn); 
1

Jedna wkładka do analizowania pliku CSV w tablicy przy użyciu str_getcsv.

$csv = array_map('str_getcsv', file('qryWebsite.csv')); 

Aby zbudować zapytanie do bazy danych, które będą importować wszystkie wartości w bazie danych na raz:

$query = 
    "INSERT INTO tbl_name (a,b,c) VALUES " . 
    implode(',', array_map(function($params) use (&$values) { 
     $values = array_merge((array) $values, $params); 
     return '(' . implode(',', array_fill(0, count($params), '?')) . ')'; 
    }, $csv)); 

To zbuduje przygotowaną instrukcję symbolami znak zapytania, jak:

INSERT INTO tbl_name (a,b,c) VALUES (?,?,?),(?,?,?),(?,?,?),(?,?,?) 

, a zmienna $values będzie jednowymiarową tablicą zawierającą wartości instrukcji. Jednym z zastrzeżeń jest to, że plik csv powinien zawierać mniej niż 65 536 wpisów (maksymalna liczba symboli zastępczych).

1

Jedna wkładka do analizowania pliku CSV w tablicy

$csv = array_map('str_getcsv', file('data.csv'));