- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个从燃料供应商门户网站下载的 CSV 文件。数据由分号分隔,在包含字段标题的行之前有 11 行注释。
有 3 行摘要,并且是 Unix LF 编码
我使用 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/
;用作语句分隔符,所以放置多个;在语句的末尾很好,因为它只是添加了空语句。 我遇到了这个有多个 ; 的代码最后但删除它们会导致错误: $line =~s;[.,]$;;; 应该与 $line =~s;
当使用自动完成来填充方法参数时,大多数情况下最后应该有一个分号。 似乎必须有一些键盘快捷键可以在最后输入分号(也可能是换行符),但我找不到它! 谢谢。 编辑 : 也许问题不清楚,当完成一个自动完成方法
已关闭。这个问题是 not reproducible or was caused by typos 。目前不接受答案。 这个问题是由拼写错误或无法再重现的问题引起的。虽然类似的问题可能是 on-top
我知道我不应该在循环后放置分号。但我正在学习,不小心插入了一个。我想确切地知道我的错误到底发生了什么。所以下次发生类似的事情时,我就知道错误的根源。 在下面的代码中,在这部分代码中: triangul
我想拆分我的查询,但没有得到完全符合我要求的答案。 我的字符串如下: select 1;select \\2; select 3\\;copy customer from 's3://mybucket
VBA 中带有 Debug.Print 语句的分号 ( ; ) 的实际值/含义是什么? 我经常使用它,但对它没有真正的了解,我所知道的是它不等于 vbTab 常量,因为间距不一样。 IE。 Debug
我需要从 HTML 中的 javascript 代码获取分配的变量名称和值。 例如有html代码: ~~ contents var value1 = 55;var value2= 27;
我正在用 JSFiddle 校对这个函数,它说第二行缺少分号,但是我无法确定它会去哪里。 function debtSpiral() { var debtID = setInterval(debt
给定一个使用 ; 策略的有效 Coq 证明,是否有一个通用公式可以将其转换为用 . 替换 ; 的有效等效证明;? 许多 Coq 证明使用 ; 或战术排序策略。作为初学者,我想观察各个步骤的执行,因此我
我被困在工作中,电脑被锁定。但我正在尝试练习我的 Scala。我正在使用 Ideone.com,因为我什至无法安装 scalac... 无论如何这不是编译: class DPt(var name: S
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 这个问题似乎偏离主题,因为它缺乏足够的信息来诊断问题。 更详细地描述您的问题或 include a mini
考虑这些文件名。 ; f - Copy.txt ;f.txt f - Copy ;- Copy.txt f - Copy.txt 我有这段代码可以解析任何文件中的 & 符号,答案是:Drag and
为什么带有验证器(Mozilla 或 JSlint)的 Aptana 会提示这段代码: var collectionOfValues = { key0 : value0; key1 :
有什么方法可以绑定(bind); (\059) 到 tmux 中的命令? 默认情况下,它绑定(bind)到最后一个 Pane ;但是,我想将其重新绑定(bind)到 select-pane -R。 我
我有一个 Java 字符串,它实际上是一个 SQL 脚本。 CREATE OR REPLACE PROCEDURE Proc AS b NUMBER:=3; c
我有一个 python 字符串: names = "John, Paul; Sally/Frank" 我想用 , 分割字符串;/.我试过: names.split(",") 但我不确定如何通过所有分隔
在声明一组变量时使用逗号而不是分号有什么区别和/或优点(如果有的话)。 例如: var foo = 'bar', bar = 'foo'; 对比 var foo = 'bar'; var bar =
在声明一组变量时使用逗号而不是分号有什么区别和/或优点(如果有的话)。 例如: var foo = 'bar', bar = 'foo'; 对比 var foo = 'bar'; var bar =
我一直在尝试并查看各种命令,但似乎无法找到正确的语法; 我想合并两个 ls 命令的输出,除以 ;(分号)并将输出写入文件。 我的 ls 命令是: ls *.lst ls -d -1 $PWD/*.ls
在声明一组变量而不是分号时使用逗号有什么区别和/或优点(如果有的话)。 例如: var foo = 'bar', bar = 'foo'; 对比 var foo = 'bar'; var bar =
我是一名优秀的程序员,十分优秀!