【问题标题】:Import all but last three rows of CSV file into SQL table将除最后三行之外的所有 CSV 文件导入 SQL 表
【发布时间】:2019-10-05 15:37:48
【问题描述】:

我有一个由另一个进程(我无法更改)创建的 CSV 文件,该文件在数据下方的一行中包含时间戳和用户名。我需要在没有最后一行的情况下导入数据,因为它是无效的列值会导致错误。

如果我手动删除这一行(我想避免这样做),我的 SQL 可以使用以下方法成功导入数据:

BULK INSERT #TempReport
FROM 'D:\ac2000\Reg.csv'
WITH
(
FORMAT = 'CSV', 
FIRSTROW = 2, -- second row so skip header row in csv file
FIELDTERMINATOR = ',',  --CSV field delimiter
FIELDQUOTE = '"', -- Double quote mark is a text delimiter
ROWTERMINATOR = '\n'
)

我知道 Bulk Insert 中还有一个 LASTROW 选项,但是 CVS 每次都会有不同的行数,所以我需要一种计算行数的方法,而不需要导入它! ...或者至少,不使用上述方法导入它,只会导致另一个错误。

【问题讨论】:

  • 为什么不直接导入所有行并从临时表中删除最后 3 行?
  • @PeterHe 就是这样 - 由于最后一行中的时间戳,导入将首先不起作用,这会导致错误,因为它是无效的列值。
  • 我通常将整个文件导入一个带有“行号”列(identity)和varchar(8000) 的表中,然后从那里清理它 - 删除最后一行,拆分字段。

标签: sql sql-server


【解决方案1】:

您无需导入即可阅读 csv 文件。

SELECT *
FROM OPENROWSET (
    BULK N'd:\temp\data.csv',
    FORMATFILE = 'D:\temp\fmt.fmt',
    FIRSTROW=2
) j

例如

data.csv

ID, User
1,User1
10,User 10
11,User 11
2,user2

格式化文件

13.0
2
1       SQLCHAR 0       2       ","         1     PersonID               ""
2       SQLCHAR 0       25      "\r\n"      2     FirstName              SQL_Latin1_General_CP1_CI_AS

您可以使用.fmt.xml 并使用bcp 生成它。

您可以通过下面的链接阅读有关格式文件以及如何生成格式文件的更多信息。
NON xml format file
XML format file
Generate format file

这里还有关于OPENROWSET的文档

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-29
    • 2011-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多