Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
缺少数据值的CSV PostgreSQL复制_Postgresql_Csv_Copy - Fatal编程技术网

缺少数据值的CSV PostgreSQL复制

缺少数据值的CSV PostgreSQL复制,postgresql,csv,copy,Postgresql,Csv,Copy,我正在尝试使用COPY将CSV文件导入PostgreSQL。当它碰到有空值的行时会阻塞,例如下面的第二行: 01-2001,1,2,3,4,5 01-02-2001,6,7, 我尝试过这个COPY语句,以及使用NULL和QUOTE的变体,但没有找到任何有效的方法 从“data.dat”复制数据 使用分隔符“,”CSV 有什么建议吗?数据文件位于一个22GB的大平面文件中,因此我不想直接编辑它。我建议将数字列转换为文本列,以便导入。原因是空字符串不是有效的数值。将数字列更改为文本列,导入CSV文件

我正在尝试使用COPY将CSV文件导入PostgreSQL。当它碰到有空值的行时会阻塞,例如下面的第二行:

01-2001,1,2,3,4,5

01-02-2001,6,7,

我尝试过这个COPY语句,以及使用NULL和QUOTE的变体,但没有找到任何有效的方法

从“data.dat”复制数据 使用分隔符“,”CSV


有什么建议吗?数据文件位于一个22GB的大平面文件中,因此我不想直接编辑它。

我建议将数字列转换为文本列,以便导入。原因是空字符串不是有效的数值。将数字列更改为文本列,导入CSV文件,将空值更新为null或0,然后将列更改回整数。

您的语句可疑:

COPY data FROM 'data.dat' USING DELIMITERS ',' CSV;
分隔符
在7.3之前的版本中使用。为了不破坏旧代码,仍然支持它,但不再使用它。正确的关键字是
分隔符
。而且您根本不需要指定
,因为这是
格式CSV的默认设置
此外,我引述:

文件名

输入或输出文件的绝对路径名。Windows用户可能需要使用
E'
字符串,并在路径名中使用双反斜杠

我的。在UNIX上用类似于
'/path/to/data.dat'
的内容替换
'data.dat'
,在Windows上用类似于
的内容替换
'data.dat'

对于7.3+版本,请使用:

COPY data FROM '/path/to/data.dat' CSV
对于9.0+版本,请使用:

COPY data FROM '/path/to/data.dat' (FORMAT CSV)

如果仍然出现此错误:

显然,源文件与表
数据的结构不匹配。查看源文件,转到第13行,查看列
interval\u 2400的值。很可能,这不是数字。特别是,数字类型的列中不允许使用空字符串(
'

您可以修复源文件调整表定义

ALTER TABLE data ALTER COLUMN interval_2400 TYPE text;
或者任何更合适的类型。根据名称判断,可能是
interval
。(但是
text
几乎接受任何输入值。)

或者,更好的方法是创建一个修改过的临时文件,
COPY
,修复有问题的值,然后插入到目标表中,从文本转换。见:


    • 任何带着较小文件来到这里的人:这是我发现的最简单的解决方法,可以解决csv中分隔符数量不一致的问题

    • 打开你的CSV
    • Ctrl+Shift+8(选择所有数据)
    • Ctrl+h(打开查找替换)
    • 将“查找”框留空,以便查找长度为0的字符串
    • 在“替换为”框中输入一个空格
    • 这将遍历整个CSV,并强制它在分隔符(,)中具有正确的列计数,即使该列中没有数据


      如果你对Excel没问题,你也可以把它变成一个宏,所以我的宏(Ctrl+g)一次就可以做到

      这是PostgreSQL错误-csv解析器忽略最后一个空项并抛出错误-“PG::BadCopyFileFormat:错误:缺少列的数据”

      我正在使用一个愚蠢的黑客:

      若最后一项为空,只需在字符串末尾添加一个分隔符:

      1,2,3
      1,2,,
      

      这将添加行中缺失的最后一项以导入数据。

      另一个警告-检查错误行号,确保它不是CSV文件中的空行。这将导致postgres在缺少值时抛出相同的错误

      这还不是全部。根据我的检查,上述情况在任何现代PostgreSQL(CSV模式下为空值,不带引号)下都能正常工作。可能您没有空修饰符或逗号数无效?错误:数字类型的输入语法无效:上下文:复制数据,第13行,列间隔_2400:如果我编辑文件并只读取前12行,导入工作正常。它只有在到达第13行时才会阻塞,第13行缺少数据值,就像上面的例子一样。我也遇到了同样的问题,但仍然没有找到答案。也许我必须在导入数据之前转换数据,或者不使用“复制自”功能。很遗憾,我终于找到了一条出路,但是使用python和psycopg2库。要复制的命令(您需要先获取连接并打开光标):“cursor.copy_from(f,'aircrafts',sep=',',null=''”在CSV格式中,分隔符之间的任何内容都不表示
      null
      ,而不是空字符串,这是数值的有效语法。空字符串被写为空双引号:
      。如果像我这样的人被Erwin关于空字符串在CSV文件中表示空白的有用评论弄糊涂了——我使用的是文本(TSV)文件……空白值的符号不同:'\N'.PostgreSQL 9.1.1,MacOSX 10.7.2。正如我上面提到的,导入在文件的前12行工作得很好。这些列实际上是数字的,并且与表定义相匹配。只是有些行缺少值。@user1076175:请用数据文件的前15行编辑您的问题。另外,在你的问题中加入版本信息(不是在对我的答案的评论中)。主要的问题当然是csv的损坏。现在我有一个50GB的大csv,每1000行就有一个坏行,缺少一个字段。所以问题是,我们是否可以告诉postgresql只需检查抛出错误的行并继续
      1,2,3
      1,2,,