【问题标题】:php import csv into sql databasephp将csv导入sql数据库
【发布时间】:2010-12-28 09:28:40
【问题描述】:

这有什么问题,当我从 csv 文件中回显一行并将任何内容连接到该行的末尾时,它不会显示,而是所有行都被回显并且连接的字符串只显示最后一次,这是某种缓冲的东西,它不会让我将字符串与我的 csv 文件中的东西连接起来,它在我的本地 wamp 服务器上运行,我在我的 expload 函数中尝试了不同的行分隔符,我确定文件只在行尾使用\n

我正在尝试逐行解析 csv 文件,以便在使用它构建 sql 语句并将其插入数据库之前检查它的内容。

$file = fopen($filename, "r")  
$filesize = filesize($filename);
$filecontent = fread($file, $filesize);
fclose($file); 

$rows = explode("\n", trim($filecontent)); 
foreach ($rows as $row) 
{
    echo $row . '<br />';
} 

【问题讨论】:

  • 对不起,我的坏人,我无法控制生成 csv 文件的脚本,并且告诉我使用错误的行分隔符的人,我的问题现在解决了。

标签: php sql csv


【解决方案1】:

您正在通过字符串\n 拆分字符串。除非实际的字符串“\n”出现在文件中的任何位置,否则这可能什么都不做。您的意思可能是"\n" (double quotes),这使得这成为实际的换行符。

不过,您的整个流程效率极低。您应该使用fgetcsv 并逐行处理文件,而不是一次将其全部读入内存。

$handle = fopen('test.csv', 'r');
while (($row = fgetcsv($handle)) !== false) {
    foreach ($row as $field) {
        echo $field . '<br />';
    }
}
fclose($handle);

【讨论】:

  • 双引号只是一个复制+过去的错误,所以这不是问题,但我尝试了你的代码,仍然得到了我描述的相同行为,br 标签出现在每个字段之后而不是每个之后行,如果我在 for 循环之前或之后回显某些内容,它只会出现一次
【解决方案2】:

使用fgetcsv()函数将CSV文件转换为数组:

$csvFile = "test.csv";
$csvSeparator = ",";
$csvFileLength = filesize($csvFile);

$handle = fopen($csvFile, "r");
    $csvData = fgetcsv($handle, $csvFileLength, $csvSeparator);
fclose($handle);

转储数据以显示结构:

var_dump($csvData);

现在您可以将数据转换为在数据库中使用。

【讨论】:

  • 我以前玩过 fgetcsv,我在 php.net 上尝试了每个示例,但仍然遇到同样的问题,fgetcsv 只是在一个数组中返回 csv 文件中的每个字段,我不认为它正在读取行分隔符正确,我认为它默认设置为 \r\n 并且不能更改。
猜你喜欢
  • 1970-01-01
  • 2023-03-23
  • 1970-01-01
  • 1970-01-01
  • 2015-01-30
  • 2016-05-14
  • 1970-01-01
  • 1970-01-01
  • 2011-08-09
相关资源
最近更新 更多