首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将CSV文件导入Postgre

将CSV文件导入Postgre
EN

Stack Overflow用户
提问于 2015-06-13 02:32:03
回答 2查看 3.3K关注 0票数 5

我正在编写一些PHP代码,以便将CSV文件导入Postgre,并得到下面的错误。你能帮帮我吗?

警告: pg_end_copy():查询失败:错误:数据提示中找到的文字换行符:使用"\n“表示换行符。上下文:复制t_translation,第21行的C:\xampp\htdocs\importing_csv\importcsv.php中的第2行

代码语言:javascript
复制
<?php
$connString = 'host = localhost dbname= importdb user=postgres password=pgsql';
$db = pg_connect($connString);

$file = file('translation.csv');

//pg_exec($db, "CREATE TABLE t_translation (id numeric, identifier char(100), device char(10), page char(40), english char(100), date_created char(30), date_modified char(30), created_by char(30), modified_by char(30) )");
pg_exec($db, "COPY t_translation FROM stdin");


foreach ($file as $line) {

    $tmp = explode(",", $line);

    pg_put_line($db, sprintf("%d\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n", $tmp[0], $tmp[1], $tmp[2], $tmp[3], $tmp[4], $tmp[5], $tmp[6], $tmp[7], $tmp[8]));

}

pg_put_line($db, "\\.\n");
pg_end_copy($db);
?>
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-06-13 03:10:48

您需要在FILE_IGNORE_NEW_LINES函数中指定file()标志作为第二个参数,否则默认情况下将在每个数组项的末尾包含换行符。这很可能是造成这个问题的原因。

因此,只需添加此标志FILE_IGNORE_NEW_LINES,以便从csv文件中提取的行在每一行末尾不会有换行符:

代码语言:javascript
复制
$file = file('translation.csv', FILE_IGNORE_NEW_LINES);

另外,我建议使用fgetcsv()来读取csv文件。

票数 3
EN

Stack Overflow用户

发布于 2021-03-04 21:00:14

如果您愿意使用PDO (需要单独的连接调用),那么有一种优雅的解决方案,它不需要PHP处理那么多数据,而且只要CSV头中的字段名称与数据库中的名称匹配,该解决方案也可以用于任何字段的组合。我假设您已经初始化了PDO,并将对象设置为$pdo,并且文件名为$filename。然后:

代码语言:javascript
复制
$file=fopen($filename,'r');
$lines=explode("\n", fread ($file, filesize($filename)));
if (end($lines)=='') array_pop($lines); // Remove the last line if it empty, as often happens, so it doesn't generate an error with postgres
$fields=array_shift($lines); // Retrieve & remove the field list
$null_as="\\\\N"; // Or whatever your notation for NULL is, if needed
$result=$pdo->pgsqlCopyFromArray('t_translation',$lines,',',$null_as,$fields);

这是非常小的,除了$result返回成功或失败之外,没有其他错误处理,但是它可以是一个起点。

我更喜欢这个解决方案,而不是您所采用的方法,因为您根本不需要指定字段,它都是自动处理的。

如果您不想使用PDO,可以使用您的设置和语法提供类似的解决方案,只需将最后一行替换为:

代码语言:javascript
复制
pg_copy_from($db,'t_translation',$lines,',',$null_as)

但是,此解决方案不动态调整字段名,CSV的字段需要与表中的字段完全匹配。但是,名称不需要对齐,因为CSV文件的第一行被忽略了。不过,我还没有测试这最后一行,因为我没有使用这种类型的连接,因此可能会出现错误。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30814529

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档