【问题标题】:Reading .csv file in php在 php 中读取 .csv 文件
【发布时间】:2011-07-24 06:35:55
【问题描述】:

我想在 PHP 中读取 .csv 文件并将其内容放入数据库。我写了以下代码:

$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);

我没有收到任何错误,但它没有显示结果。

【问题讨论】:

    标签: php csv


    【解决方案1】:

    我正在使用parseCSV 类从 csv 文件中读取数据。它可以在读取 csv 文件时提供更大的灵活性。

    【讨论】:

    • pssst 差不多一年后我找到了你的blog
    【解决方案2】:

    这没有经过测试......但这样的事情应该可以解决问题:

    $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."')
                ");
            }
        }
    }
    

    【讨论】:

    • 毫无意义。为什么不使用LOAD DATA,它可以利用TERMINATED BY处理CSV
    • @Gary, LOAD DATA 由于可能存在安全威胁,经常在共享主机上被禁用。
    • @Gary & Charles 和我接受了他的尝试
    • 任何好的托管公司都应该可以访问可以导入 CSV 的 phpMyAdmin。如果没有,请将其复制到您的主机并使用它。甚至 phpMiniAdmin 也可以导入 CSV。
    • 也许他正在为网站的客户设计一些能够导入数据的东西。
    【解决方案3】:
    $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

    【讨论】:

      【解决方案4】:

      使用 str_getcsv 将 CSV 文件解析为数组的一个内衬。

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

      构建一个将所有值一次导入数据库的数据库查询:

      $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 ) );
      

      这将使用问号占位符构建一个准备好的语句,例如:

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

      和变量$values 将是保存语句值的一维数组。这里需要注意的一点是 csv 文件应包含少于 65,536 个条目(占位符的最大数量)。

      【讨论】:

        【解决方案5】:

        试试这个....

        在 PHP 中,能够读取 CSV 文件并访问其数据通常很有用。这就是 fgetcsv() 函数派上用场的地方,它将读取 CSV 文件的每一行并将每个值分配给一个 ARRAY。您可以在函数中定义分隔符,也可以查看 fgetcsv() 的 PHP 文档以获取更多选项和示例。

          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>';
        

        【讨论】:

          【解决方案6】:

          一个将 CSV 文件解析为数组的内衬

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

          【讨论】:

            【解决方案7】:

            你可以试试下面的代码。它对我来说很完美。我有评论让它更容易理解。你可以参考这段代码。

            <?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);
            

            【讨论】:

              【解决方案8】:

              如果你使用composer package manager,你也可以依赖league/csv

              据他们documentation

              use League\Csv\Reader;
              
              //load the CSV document from a file path
              $csv = Reader::createFromPath('/path/to/your/csv/file.csv', 'r');
              $csv->setHeaderOffset(0);
              
              $header = $csv->getHeader(); //returns the CSV header record
              $records = $csv->getRecords(); //returns all the CSV records as an Iterator object
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2017-09-27
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2014-01-10
                • 2010-11-27
                • 2012-09-28
                相关资源
                最近更新 更多