Sql CSV文件的OpenRowset返回空白或有错误

Sql CSV文件的OpenRowset返回空白或有错误,sql,sql-server-2008,csv,Sql,Sql Server 2008,Csv,所以早些时候,我即将创建一个代码,将机器生成的CSV文件导入到我们的数据库中。我在Excel中创建了一个,并使用了以下代码 select *from openrowset('MSDASQL','Driver={Microsoft Access Text Driver (*.txt, *.csv)}' ,'select * from D:\Test.CSV') select * from OpenRowset('MSDASQL', 'Driver={Microsoft Access Text D

所以早些时候,我即将创建一个代码,将机器生成的CSV文件导入到我们的数据库中。我在Excel中创建了一个,并使用了以下代码

select *from openrowset('MSDASQL','Driver={Microsoft Access Text Driver (*.txt, *.csv)}'
,'select * from D:\Test.CSV')
select * from OpenRowset('MSDASQL', 'Driver={Microsoft Access Text Driver (*.txt, *.csv)};DefaultDir=D:\Data\sample\;','select * from device1_2016-08-03_15-24-58.csv')
而且效果很好。 但当我处理实际数据时。上述代码不起作用

因此CSV文件包含一个前导的18行数据,可以删除这些信息(只是机器的名称),所需的数据位于第19行

在搜索之后,我发现了一段代码,并尝试将其保存到CSV文件中,该文件是

    SELECT *
        FROM OPENROWSET(BULK 'D:\Data\sample\device1_2016-08-03_15-24-58.csv',
        FORMATFILE='D:\Data\sample\BCPFormat.xml',
        FIRSTROW = 19) AS a
但是数据是空白的

我也试过这个代码

select *from openrowset('MSDASQL','Driver={Microsoft Access Text Driver (*.txt, *.csv)}'
,'select * from D:\Test.CSV')
select * from OpenRowset('MSDASQL', 'Driver={Microsoft Access Text Driver (*.txt, *.csv)};DefaultDir=D:\Data\sample\;','select * from device1_2016-08-03_15-24-58.csv')
错误表明

An error occurred while preparing the query "select * from device1_2016-08-03_15-24-58.csv" for execution against OLE DB provider "MSDASQL" for linked server "(null)". 
我们使用的服务器DBMS是SQL server 2008 R2。我们还使用MS Office 2010创建电子表格

欢迎提出任何意见,提前谢谢

编辑:

我将包括CSV文件的屏幕截图

我还将包括XML文件(因为我已经读到FMT文件是一个XML文件,请检查这是否正确。)


这是因为CSV中的每一行都没有正确的字段数,因此无法对其进行分析。即使只要求从第19行(或第21行)开始,仍然会解析整个文件

您可以通过将
.CSV
文件修改为每行有14个字段(即13个逗号)来解决此问题:

Vendor,GUARDIAN,,,,,,,,,,,,
Model,ZR-RX45,,,,,,,,,,,,
Version,Ver1.04,,,,,,,,,,,,
Sampling,10s,,,,,,,,,,,,
Total data points,0,,,,,,,,,,,,      
Start time,2016-08-03,15:25:01,,,,,,,,,,,
End time,2016-08-03,15:24:59,,,,,,,,,,,
Trigger time,2016-07-30,08:21:50,,,,,,,,,,,
AMP Settings,,,,,,,,,,,,,
CH,Signal name,Input,Range,Filter,Span,,,,,,,,,,,,
CH34, "PC-2",TEMP,TC_K,Off,250.000000,0.000000,degC,,,,,,,
CH35, "PC-11",TEMP,TC_K,Off,250.000000,0.000000,degC,,,,,,,
CH36, "PC-19",TEMP,TC_K,Off,250.000000,0.000000,degC,,,,,,,
CH37, "PC-16",TEMP,TC_K,Off,250.000000,0.000000,degC,,,,,,,
CH38, "PC-08",TEMP,TC_K,Off,250.000000,0.000000,degC,,,,,,,
CH39, "PC-18",TEMP,TC_K,Off,250.000000,0.000000,degC,,,,,,,
Logic/Pulse,Off,,,,,,,,,,,,
Data,,,,,,,,,,,,,
Number,Date&Time,ms,CH34,CH35,CH36,CH37,CH38,CH39,Alarm1-10,Alarm11-20,Alarm21-30,Alarm31-40,AlarmOut
NO.,Time,ms,degC,degC,degC,degC,degC,degC,A1234567890,A1234567890,A1234567890,A1234567890,A1234
1,2016-07-30 08:21:50,000,+0.0,+0.0,+0.0,+0.0,+0.0,+0.0,LLLLLLLLLL,LLLLLLLLLL,LLLLLLLLLL,LLLLLLLLLL,LLLL
然后,您的命令将起作用:

SELECT a.*
FROM OPENROWSET(BULK 'D:\some_location\device1_2016-08-03_15-24-58.csv',
                FORMATFILE='D:\some_location\BCPFormat.xml',
                FIRSTROW = 21) AS a

这是因为CSV中的每一行都没有正确的字段数,因此无法对其进行分析。即使只要求从第19行(或第21行)开始,仍然会解析整个文件

您可以通过将
.CSV
文件修改为每行有14个字段(即13个逗号)来解决此问题:

Vendor,GUARDIAN,,,,,,,,,,,,
Model,ZR-RX45,,,,,,,,,,,,
Version,Ver1.04,,,,,,,,,,,,
Sampling,10s,,,,,,,,,,,,
Total data points,0,,,,,,,,,,,,      
Start time,2016-08-03,15:25:01,,,,,,,,,,,
End time,2016-08-03,15:24:59,,,,,,,,,,,
Trigger time,2016-07-30,08:21:50,,,,,,,,,,,
AMP Settings,,,,,,,,,,,,,
CH,Signal name,Input,Range,Filter,Span,,,,,,,,,,,,
CH34, "PC-2",TEMP,TC_K,Off,250.000000,0.000000,degC,,,,,,,
CH35, "PC-11",TEMP,TC_K,Off,250.000000,0.000000,degC,,,,,,,
CH36, "PC-19",TEMP,TC_K,Off,250.000000,0.000000,degC,,,,,,,
CH37, "PC-16",TEMP,TC_K,Off,250.000000,0.000000,degC,,,,,,,
CH38, "PC-08",TEMP,TC_K,Off,250.000000,0.000000,degC,,,,,,,
CH39, "PC-18",TEMP,TC_K,Off,250.000000,0.000000,degC,,,,,,,
Logic/Pulse,Off,,,,,,,,,,,,
Data,,,,,,,,,,,,,
Number,Date&Time,ms,CH34,CH35,CH36,CH37,CH38,CH39,Alarm1-10,Alarm11-20,Alarm21-30,Alarm31-40,AlarmOut
NO.,Time,ms,degC,degC,degC,degC,degC,degC,A1234567890,A1234567890,A1234567890,A1234567890,A1234
1,2016-07-30 08:21:50,000,+0.0,+0.0,+0.0,+0.0,+0.0,+0.0,LLLLLLLLLL,LLLLLLLLLL,LLLLLLLLLL,LLLLLLLLLL,LLLL
然后,您的命令将起作用:

SELECT a.*
FROM OPENROWSET(BULK 'D:\some_location\device1_2016-08-03_15-24-58.csv',
                FORMATFILE='D:\some_location\BCPFormat.xml',
                FIRSTROW = 21) AS a

我创建了一个包含两个字段和19行的虚拟
.csv
文件,在SQL中设置了一个具有匹配模式的表,为该表创建了一个
.fmt
文件,并运行了与上面相同的命令(尽管我的
.csv
.fmt
文件的文件路径不同)。也许你可以发布你的
.csv
.fmt
文件的样本,让我们重现这个问题?FWIW,在我测试的DefaultDir中,我没有
\在目录后面。示例:
DefaultDir=D:\Data\sample
@3N1GM4感谢您的洞察力,我已更新了代码以获取更多信息。@WEI\u DBA感谢您的洞察力,我也尝试删除斜杠(/),起初速度很慢,然后出现错误。如果在文本编辑器中打开它,您的
.CSV
会是什么样子?我怀疑您的格式文件中的分隔符应该是“
”、“
”,而不是“
”、“
”,因为您的CSV文件可能没有将每个值都括在双引号中。在我创建了一个包含两个字段和19行的虚拟
.CSV
文件后,这对我来说很好,在SQL中设置了一个具有匹配架构的表,为该表创建了一个
.fmt
文件,并运行了与上述命令相同的命令(尽管指向my
.csv
.fmt
文件的文件路径不同)。也许你可以发布你的
.csv
.fmt
文件的样本,让我们重现这个问题?FWIW,在我测试的DefaultDir中,我没有
\在目录后面。示例:
DefaultDir=D:\Data\sample
@3N1GM4感谢您的洞察力,我已更新了代码以获取更多信息。@WEI\u DBA感谢您的洞察力,我也尝试删除斜杠(/),起初速度很慢,然后出现错误。如果在文本编辑器中打开它,您的
.CSV
会是什么样子?我怀疑您的格式文件中的分隔符应该是“
”、“
”,而不是“
”、“
”,因为您的CSV文件可能没有用双引号括起每个值。因此,我必须将我的CSV文件改为那种格式,先生?我说的对吗?哇!是的!谢谢所以,我必须把我的CSV文件改成那种格式,先生?我说的对吗?哇!是的!谢谢