gpt4 book ai didi

c# - 导入以分号分隔的 CSV 文件

转载 作者:行者123 更新时间:2023-11-30 18:12:04 26 4
gpt4 key购买 nike

我有一个从燃料供应商门户网站下载的 CSV 文件。数据由分号分隔,在包含字段标题的行之前有 11 行注释。

enter image description here

有 3 行摘要,并且是 Unix LF 编码

enter image description here

我使用 SQL 命令 BULK INSERT 从另一个供应商导入另一个数据文件:-

BULK INSERT [dbo].[fuel_stagingShell]
FROM '\\server\path\dataimports\fueldata\Shell\results.csv'
WITH
(
FORMAT = 'CSV',
FIELDQUOTE ='"',
FIRSTROW=2,
FIELDTERMINATOR = ',',
ROWTERMINATOR='\n',
TABLOCK
)

这是完美的,因为它会在瞬间导入文件。

但是,当我尝试 BULK INSERT 时,它无法处理该文件。是的,我可以通过更改 FIRSTROW 来跳过标题行,但是文件末尾的三行存在问题。 BULK INSERT 命令的 LASTROW 参数需要一个行号,我不知道该行号,因为文件的长度是可变的。

我正在考虑在 C# 中导入文件,跳过前 11 行,当我到达以“Total;”开头的行时终止并根据标题名称匹配列。

有没有一种方法可以导入数据行,并将其拆分为数组/POCO/其他东西,如果您知道它可用,这真的是一种非常简单明了的方法吗?

我还有这个供应商的另一个文件,格式相同,只是少了六个字段;这就是为什么我认为通过匹配列名来填充,但我知道在每一行上填充每个属性可能比其他未知方法慢很多。

编辑:我复制了这个问题,这样我就可以用我在处理文件时遇到的错误来编辑这篇文章,而这个人得到了同样的错误消息 ("IID_IColumnsInfo") error with SQL Server BULK INSERT of CSV file ,所以我将\n 替换为 0x0a 并添加了一个任意的 LASTROW 参数,正如@steve 在评论中所暗示的那样,当我注释掉 FIELDQUOTE 参数时,它导入了一堆行。

我现在想我可以预先解析文件并计算有多少行,然后从我的应用程序中将其构建到动态 SQL 中。或者,用更长的 varchar 字段修改我的登台表,这些字段将接受文件末尾的所有注释位,并在验证数据并将其转换为事务表的 T-SQL 存储过程中忽略它们。

这是我使用的 T-SQL:

BULK INSERT [dbo].[fuel_stagingDkv]
FROM '\\server\path\dataimports\fueldata\DKV\Results.csv'
WITH
(
FORMAT = 'CSV',
--FIELDQUOTE ='',
FIRSTROW=12,
LASTROW=5000,
FIELDTERMINATOR = ';',
ROWTERMINATOR='0x0a',
TABLOCK
)

最佳答案

如果你知道你需要在底部跳过一定数量的文件并且你可以启用xp_cmdshell来获取文件的行数,你可以这样做:

USE tempdb
GO

DECLARE
@filePath nvarchar(max) = '\\server\path\dataimports\fueldata\DKV\Results.csv'

DECLARE
@cmd nvarchar(1000) = 'type "' + @filePath + '" | find /c /v ""'
,@lastRow int

DECLARE @Output TABLE (
Id int IDENTITY(1, 1)
,CmdOutput nvarchar(300)
)
INSERT INTO @Output ( CmdOutput )
EXEC xp_cmdshell @cmd

SELECT TOP 1 @lastRow = CmdOutput
FROM @Output
WHERE
CmdOutput IS NOT NULL
ORDER BY
Id DESC


BULK INSERT [dbo].[fuel_stagingDkv]
FROM '\\server\path\dataimports\fueldata\DKV\Results.csv'
WITH
(
FORMAT = 'CSV',
--FIELDQUOTE ='',
FIRSTROW=12,
LASTROW=@lastRow,
FIELDTERMINATOR = ';',
ROWTERMINATOR='0x0a',
TABLOCK
)

或者,您可以使用 xp_cmdshell 创建一个没有第一行和最后一行的新文件。

关于c# - 导入以分号分隔的 CSV 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56054385/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com