我想知道是否有办法将 csv 文件复制到临时表中,其中 csv 文件中的列数未知。我使用的数据库软件是 PgAdmin III。我发现如果我知道列数,那么我可以创建一个包含该列数的临时表,然后像这样复制 csv 文件:
CREATE TEMPORARY TABLE temp
(
col1 VARCHAR(80),
col2 VARCHAR(80),
....
coln VARCHAR(80)
);
COPY temp FROM 'C:/Users/postgres/Boost.txt' CSV HEADER DELIMITER E' '
Run Code Online (Sandbox Code Playgroud)
但是,如果我尝试简单地将 csv 文件复制到临时表中没有列的临时表,Postgresql(8.4 版)会抱怨我正在使用一个列数少于 csv 文件的表。我一直在研究,但似乎在 Postgresql 文档中找不到任何关于此的内容。有谁知道在 Postgresql 中是否可以将 csv 文件复制到具有在运行时决定的任意数量的列的临时表中?一旦临时表加载了 csv 文件,我计划在它被销毁之前用临时表与其他表进行一些比较。csv 文件中的第一行也包含标题。
我是数据库管理的新手,我们正在使用 PostgreSQL。我需要做的就是将 CSV 文件(对应大约 200 个表)迁移到我们的数据库。为每个 CSV 文件手动创建表格有点烦人,所以请帮帮我。有什么办法不仅可以导入数据,还可以从CSV文件生成表格吗?
我有一个很大的制表符分隔文件,我想将其读入 PostgreSQL 9.5 中的表。 它包含双引号和反斜杠,我想将它们视为常规字符。
我认为 COPY FROM 是要走的路,但我不知道如何禁用转义。
以下是数据示例(来自Google 的 ngram 数据集):
aX13_X 2006 8 5
aX13_X 2007 4 3
aX13_X 2008 2 1
a\ 1852 1 1
a\ 1935 1 1
a\ 1937 2 2
ACT1V1T1ES 2003 15 11
ACT1V1T1ES 2004 63 6
ACT1V1T1ES 2005 1 1
ACT1V1T1ES 2006 5 4
ACT1V1T1ES 2008 4 3
ACTION=" 1995 3 3
ACTION=" 1996 6 5
ACTION=" 1997 9 7
ACTION=" 1998 19 11
ACTION=" 1999 11 5
Run Code Online (Sandbox Code Playgroud)
和表: …
我一直在尝试将一个CSV表上传到我的远程服务器数据库中,但我发现了一个错误。我MySQL在 RedHat Linux 发行版中使用。我的 mycsv.csv 文件如下所示:
aa,ProductDescription,country,potato,L,11/18/2013,N,05
bb,ProductDescription,country,tomato,L,12/31/9999,N,05
cc,ProductDescription,country,curry,M,01/01/2014,Y,05
dd,ProductDescription,country,spicy,V,05/01/2015,N,
Run Code Online (Sandbox Code Playgroud)
如您所见,最后一行以逗号“,”结尾,没有任何字段(它是空的,应该是这样的,如果我可以将其更改为 NULL,则更好)。但是,当我键入以下查询时:
LOAD DATA INFILE "/home/mycsv.txt"
INTO TABLE inbound.master_data
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\r\n';
Run Code Online (Sandbox Code Playgroud)
我在命令行中收到以下错误
错误代码:1366。不正确的整数值:“product_life_cycle”列的第 4 行
有人知道如何在最后一行的逗号后设置空值吗?(我认为这是我无法上传表格的问题)。非常感谢您提前。
表定义:
CREATE TABLE master_data
( aa varchar(6) NOT NULL,
bb varchar(50) NOT NULL,
cc varchar(3) NOT NULL,
dd varchar(2) NOT NULL,
ee varchar(1) DEFAULT NULL,
ff varchar(20) NOT NULL,
gg varchar(1) NOT NULL,
hh int(11) DEFAULT NULL,
PRIMARY KEY (aa), …Run Code Online (Sandbox Code Playgroud) 好的,所以这个问题看起来很简单。好吧,它不仅仅是加载文件。
整个故事是这样的:出于某种原因,我们的客户向我们发送了只能被描述为关系数据库的内容,被压缩,压缩成单个 csv 文件(但分隔符是波浪号而不是逗号)。实际上,这有点可怕;相同的数据在整个文件中无限重复。因此,为了使这些数据恢复秩序,我将其加载到实际的关系数据库中。由于数据量很大,将其加载到数据库中可以更轻松地检查数据是否存在问题。它还使导出变得更加容易。
每条记录有 53 行,每次传输大约有 250,000 条记录。我想把它分成 6 个标准化表。我不确定是否要验证 C# 程序或我正在使用的 SQL Server 2016 LocalDb 实例中的数据。
我不是经验丰富的 DBA;我是一名 C# 程序员,对 SQL 有所涉猎。我对语法感到很舒服,但我想确保我这样做是正确的。
此外,一切都必须完全自动化。文件进来,C# 程序在收到文件时启动,并将其加载到数据库中。
让我解释一下布局。该文件有 53 个字段,每行包含一个报表明细行(他们的收费内容、项目收费的频率、该项目的总成本或贷项等)。问题是每一行都包含整个邮寄、付款人、居民、财产和汇款的信息。知道了这一点,让我解释一下我现在是如何做的:
这不是世界上最慢的事情,但它完全是在 RAM 中完成的。由于程序在当前状态下非常接近 RAM 耗尽,我们决定将数据加载到数据库中,而不是将其全部保存在本地 RAM 中。希望这可以为潜在的回答者提供更多信息。谢谢!
我有 100 个 csv 文件,依次命名为 1,2,3....100.csv
我用这个脚本复制 csv 文件:
COPY location FROM 'C:\Program Files\PostgreSQL\9.5\data\´1.csv' DELIMITER ',';
Run Code Online (Sandbox Code Playgroud)
我会用一个涵盖所有文件(1,2,3 .... 100.csv)的脚本来执行复制。
我在 MS Windows 上使用 pgadminIII
根据 ,我有一个包含 7,590,051 行的 CSV(实际上是制表符分隔的)文件wc -l,我想使用COPY FROM. 我删除了表的主键,所以它没有约束。
我跑了COPY customer FROM '.../customer.dsv' WITH DELIMITER E'\t' CSV HEADER;,它报告导入了 7,588,671 行并且没有错误,所以它缺少 1,379 行(已经打折标题行)。
由于 PostgreSQL 没有报告任何错误,您如何建议我解决哪些行丢失(以及它们丢失的原因)?
我在将 CSV 文件从网络共享驱动器复制到 postgreSQL 时遇到问题,目前的解决方法是先将文件复制到本地驱动器,但这是链中的另一个过程,它变得过于混乱。
如果我运行以下命令
COPY test_schema.test FROM 'X:\_Postgres DBs\Testing\test_file.csv'
CSV HEADER;
Run Code Online (Sandbox Code Playgroud)
我得到:
ERROR: could not open file "X:\_Postgres DBs\Testing\test_file.csv"
for reading: No such file or directory
Run Code Online (Sandbox Code Playgroud)
好的,所以 postgreSQL Server 不理解 Windows 映射驱动器,很好,但是如果我运行:
COPY test_schema.test FROM '\\ws7.domain.com\share-name\_Postgres
DBs\Testing\test_file2.csv' CSV HEADER;
Run Code Online (Sandbox Code Playgroud)
我得到:
ERROR: could not open file "\\ws7.domain.com\share-name\_Postgres
DBs\Testing\test_file2.csv" for reading: Permission denied
Run Code Online (Sandbox Code Playgroud)
文件 test_file2.csv 可以在同一台服务器上本地打开,例如记事本/记事本++/写字板,因此看起来没有任何文件属性,例如“正在使用的文件”
任何人有任何提示如何将 COPY 与共享网络驱动器一起使用?(我们的数据库 UI 是用 Delphi 编码的,所以我正在寻找处理 postgresql 脚本的方法,我可以从 Delphi 调用,否则我将不得不编写一些繁琐的 Delphi Firedac 批处理方法。)
数据通过准备好的语句和存储过程进入我的应用程序,所以我不太担心注入。当新用户注册时,我想发送一封激活电子邮件。目前我正在使用触发器和通知来执行此操作。它看起来像这样:
CREATE FUNCTION on_sign_up() RETURNS trigger as $$
DECLARE
BEGIN
PERFORM pg_notify('sign_ups', NEW.user_id || ',' || NEW.email || ',' || NEW.activation_code);
RETURN new;
END;
$$ language plpgsql;
CREATE TRIGGER on_sign_up_trigger AFTER INSERT ON user_account
FOR EACH ROW EXECUTE PROCEDURE on_sign_up();
Run Code Online (Sandbox Code Playgroud)
我的问题是通知有效负载。如果电子邮件包含逗号,那么我不能只在 ',' 上拆分字符串。我如何转义任何东西并将其放入有效载荷中?我可以添加我自己的自定义 CSV 转义函数并调用它,但是每当我认为这样的事情是正确的答案时,我通常会遗漏一些东西。
它不一定需要是 CSV,我只是认为这是最简单的。
注意:还有其他解决方案 - 例如去除“前缀”和“后缀”,然后将其余部分视为电子邮件。我对 PostgreSQL 本身内部的这种一般的清理/转义类更感兴趣。
我试图提取的表格如下:
Table "user_account"
Column | Type | Modifiers
-----------------+---------+----------------------------
user_id | integer | not null
email | citext | not null
password_hash | text | not null …Run Code Online (Sandbox Code Playgroud) 我正在使用 SQL Server 默认导入工具导入大小约为 48 GB 的巨大数据文件。它继续为应用程序正常执行。13000000 行插入,但在此之后任务失败并出现以下错误。我无法打开 csv,因为它太庞大了,我也不能在其中逐行移动并分析统计数据。我真的很困惑如何处理这个。