读取.csv ANSI文件并写入mysql

时间:2012-07-19 13:22:46

标签: php mysql csv utf-8 ansi

我有一个问题。我有excel文件保存为CSV,我需要用PHP读取该文件并插入到mysql但问题是使用char设置特定čćšđž。我尝试了utf8_encode()以及我能想到的几乎所有内容。

Examle:

它插入“Petroviæ”但它应该是“Petrović”

编辑:

<?php

mysql_connect("localhost", "user", "pw");  
mysql_select_db("database");  


$fajl = "Prodajna mreza.csv"; 
$handle = @fopen($fajl, "r");
if ($handle) {
    $size = filesize($fajl);

    if(!$size) {
        echo "File is empty.\n";
        exit;
    }

    $csvcontent = fread($handle,$size);
    $red = 1;

    foreach(explode("\n",$csvcontent) as $line) {
        if(strlen($line) <= 20)
        {
            $red++;
            continue;
        }
        if($red == 1)
        {
            $red++;
            continue;
        }
        $nesto = explode(",", $line);

        if($nesto[0] == '')
            continue;

        mysql_query("INSERT INTO table(val1, val2, val3, val4, val5, val6, val7, val8) VALUES ('".$nesto[0]."','".$nesto[1]."','".$nesto[2]."','".$nesto[3]."','".$nesto[4]."','".$nesto[5]."','".$nesto[6]."','".$nesto[7]."')");  

        $red++;
    }
    fclose($handle);
}
mysql_close();
?>

3 个答案:

答案 0 :(得分:1)

首先关闭:使用此mysql扩展名为discouraged。所以你可能想切换到别的东西。另请注意,通过简单粘贴字符串来构成查询的方式使其容易受到SQL injection攻击。如果你真的确定在你阅读的文件内容中没有任何丑陋的惊喜,你应该这样做。

看来你的文件读取和客户端mysql代码都没有做与charset转换有关的任何事情,所以我假设那些只是传递字节,而不关心它们的解释。所以你只需要确保服务器正确解释这些字节。

从你给出的例子来看,ć变成了æ,我说你的文件在ISO-8859-2,但是数据库读的方式不同,很可能是ISO-8859-1。您应该确保您的数据库实际上可以接受其列的所有ISO-8859-2字符。阅读character set support上的MySQL手册,并将一些合适的默认字符集(可能在数据库级别上最佳)设置为utf8(首选)或latin2。您可能必须重新创建表才能应用此更改。

接下来,您应该设置连接的字符集以匹配文件的字符集。所以utf8在这里肯定是错误的,latin2是要走的路。

  • 使用您当前的API,mysql_set_charset(“latin2”)可用于实现此目的。
  • 该页面还描述了与其他前端一起使用的等效方法。
  • 作为替代方案,您可以使用查询来设置:mysql_query(“SET NAMES”latin2';“);

完成所有这些操作后,您还应确保为从数据库中读取的任何脚本正确设置内容。换句话说,生成的HTML的字符集必须与MySQL会话的character_set_results匹配。否则,很可能事情在数据库中正确存储,但在向用户显示时仍然显示为已损坏。如果您有选择,我会说在这种情况下使用utf8,因为这样做可以在需要时更容易包含不同的数据。

如果仍然存在一些问题,你应该确定它们是否在从文件读取到php时,与mysql交换数据,或者在HTML中显示结果时。字符串"Petrovi\xc4\x87"是您示例的utf8表示形式,"Petrovi\xe6"latin2形式。您可以使用这些字符串明确地使用已知编码传递数据,或者根据其中一个字符串检查传入的传输值。

答案 1 :(得分:0)

如果文件和数据库排序规则都是utf-8,那么将csv从csv导入数据库应该不会有问题。

<?php
db = @mysql_connect('localhost', 'user', 'pass');
@mysql_select_db('my_database');

$CSVFile = "file.csv";

mysql_query('LOAD DATA LOCAL INFILE "' . $CSVFile . '" INTO TABLE my_table
  FIELDS TERMINATED BY "," LINES TERMINATED BY "\\r\\n";');

mysql_close($db);

?>

答案 2 :(得分:-1)

你可以添加自己的。 CSV中的 phpmyadmin ...
导入 - &gt; format = csv并单击“import”

或者如果你不想使用phpmyadmin!

BULK INSERT csv_dump 
    FROM 'c:\file.csv' 
    WITH 
    ( 
        FIELDTERMINATOR = '\t', 
        ROWTERMINATOR = '\n' 
    )