4

我有以下格式的 CSV 文件:

data, data, "timestamp", data, data, data, data, data

我需要从时间戳数据周围删除双引号,然后将其作为DATETIME数据类型插入表中。

在研究了格式文件之后,我想出了这个:

10.0
8
1   SQLCHAR 0   12  ","     1   Data        SQL_Latin1_General_CP1_CI_AS
2   SQLCHAR 0   12  ","     2   Data        SQL_Latin1_General_CP1_CI_AS
3   SQLCHAR 0   26  "",""   3   Timestamp   SQL_Latin1_General_CP1_CI_AS
4   SQLCHAR 0   41  ","     4   Data        SQL_Latin1_General_CP1_CI_AS
5   SQLCHAR 0   41  ","     5   Data        SQL_Latin1_General_CP1_CI_AS
6   SQLCHAR 0   41  ","     6   Data        SQL_Latin1_General_CP1_CI_AS
7   SQLCHAR 0   5   ","     7   Data        SQL_Latin1_General_CP1_CI_AS
8   SQLCHAR 0   12  "0x0a"  6   Data        SQL_Latin1_General_CP1_CI_AS

其中第三行 Timestamp 是带有双引号的项目。

尝试在批量插入中使用此文件会导致错误消息

消息 4823,级别 16,状态 1,行 2 无法批量加载。格式文件中的列号无效。

有没有办法可以改变格式文件来做我需要的事情?我正在使用 MSSQL。

4

2 回答 2

5

那么您的无效列号错误可能是由于在您的目标字段编号中重复了第 6 列而不是第 8 列。

但是要删除“”,您需要在第 2 列和第 3 列的分隔符中使用 \",如下所示...

SQLCHAR 0   12  ","     1   Data        SQL_Latin1_General_CP1_CI_AS
SQLCHAR 0   12  ",\""   2   Data        SQL_Latin1_General_CP1_CI_AS
SQLCHAR 0   26  "\","   3   Timestamp   SQL_Latin1_General_CP1_CI_AS
SQLCHAR 0   41  ","     4   Data        SQL_Latin1_General_CP1_CI_AS
SQLCHAR 0   41  ","     5   Data        SQL_Latin1_General_CP1_CI_AS
SQLCHAR 0   41  ","     6   Data        SQL_Latin1_General_CP1_CI_AS
SQLCHAR 0   5   ","     7   Data        SQL_Latin1_General_CP1_CI_AS
SQLCHAR 0   12  "\r\n"  6   Data        SQL_Latin1_General_CP1_CI_AS

-- note: use \r\n for row terminator for an Excel file saved as CSV

因此,对于第 2 列的分隔符实际上是“”,而第 3 列(时间戳)的分隔符是“,” - 因为它是分隔符的一部分,所以从数据中删除了“。

注意:如果您的第一行中有列标题,这将无法正常工作,即如果您的第一行包含列标题,例如...

Field1Name,Field2Name,Timestamp,Field3Name ...

那么上面的分隔符将不适用于该行,因为列标题时间戳周围没有引号。这样做的结果是您的第一行将在第 1 列和第 2 列中包含正确的数据,但是第 3 列在第 1 行 (",) 中没有有效的分隔符,因此它包含所有其余的列标题和前 3第 2 行的字段,直到它最终在第 2 行的第 3 列末尾找到正确的分隔符 (",)。然后第 2 行的其余部分出现在后面的列中。一团糟。你不能通过使用来绕过它

FIRSTROW = 2

您必须删除标题行,在第 3 列标题周围加上引号 -

Field1Name,Field2Name,"Timestamp",Field3Name ...

在完成批量插入后通过 SQL 删除引号。

于 2013-01-24T23:07:52.900 回答
0

这行得通吗:

SQLCHAR 0   12  ","     1   Data        SQL_Latin1_General_CP1_CI_AS
SQLCHAR 0   12  ","     2   Data        SQL_Latin1_General_CP1_CI_AS
SQLCHAR 0   26  '","'   3   Timestamp   SQL_Latin1_General_CP1_CI_AS
SQLCHAR 0   41  ","     4   Data        SQL_Latin1_General_CP1_CI_AS
SQLCHAR 0   41  ","     5   Data        SQL_Latin1_General_CP1_CI_AS
SQLCHAR 0   41  ","     6   Data        SQL_Latin1_General_CP1_CI_AS
SQLCHAR 0   5   ","     7   Data        SQL_Latin1_General_CP1_CI_AS
SQLCHAR 0   12  "0x0a"  6   Data        SQL_Latin1_General_CP1_CI_AS
于 2012-11-27T17:25:40.223 回答