【问题标题】:OpenRowset for CSV file returns blank or has errorsCSV 文件的 OpenRowset 返回空白或有错误
【发布时间】:2016-11-23 08:41:40
【问题描述】:

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

select *from openrowset('MSDASQL','Driver={Microsoft Access Text Driver (*.txt, *.csv)}'
,'select * from D:\Test.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)};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 文件,请检查这是否正确。)

<?xml version="1.0"?>
<BCPFORMAT xmlns="http://schemas.microsoft.com/sqlserver/2004/bulkload/format"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
 <RECORD>
  <FIELD ID="1" xsi:type="CharTerm" TERMINATOR=',' />
  <FIELD ID="2" xsi:type="CharTerm" TERMINATOR=',' />
  <FIELD ID="3" xsi:type="CharTerm" TERMINATOR=',' />
  <FIELD ID="4" xsi:type="CharTerm" TERMINATOR=','/>
  <FIELD ID="5" xsi:type="CharTerm" TERMINATOR=',' />
  <FIELD ID="6" xsi:type="CharTerm" TERMINATOR=',' />
  <FIELD ID="7" xsi:type="CharTerm" TERMINATOR=',' />
  <FIELD ID="8" xsi:type="CharTerm" TERMINATOR=',' />
  <FIELD ID="9" xsi:type="CharTerm" TERMINATOR=',' />
  <FIELD ID="10" xsi:type="CharTerm" TERMINATOR=',' />
  <FIELD ID="11" xsi:type="CharTerm" TERMINATOR=',' />
  <FIELD ID="12" xsi:type="CharTerm" TERMINATOR=',' />
  <FIELD ID="13" xsi:type="CharTerm" TERMINATOR=',' />
  <FIELD ID="14" xsi:type="CharTerm" TERMINATOR='\n' />
 </RECORD>
 <ROW>
  <COLUMN SOURCE="1" NAME="NO." xsi:type="SQLVARYCHAR" />
  <COLUMN SOURCE="2" NAME="Time" xsi:type="SQLVARYCHAR" />
  <COLUMN SOURCE="3" NAME="ms" xsi:type="SQLVARYCHAR" />
  <COLUMN SOURCE="4" NAME="degC1" xsi:type="SQLVARYCHAR" />
  <COLUMN SOURCE="5" NAME="degC2" xsi:type="SQLVARYCHAR" />
  <COLUMN SOURCE="6" NAME="degC3" xsi:type="SQLVARYCHAR" />
  <COLUMN SOURCE="7" NAME="degC4" xsi:type="SQLVARYCHAR" />
  <COLUMN SOURCE="8" NAME="degC5" xsi:type="SQLVARYCHAR" />
  <COLUMN SOURCE="9" NAME="degC6" xsi:type="SQLVARYCHAR" />
  <COLUMN SOURCE="10" NAME="A12345678901" xsi:type="SQLVARYCHAR" />
  <COLUMN SOURCE="11" NAME="A12345678902" xsi:type="SQLVARYCHAR" />
  <COLUMN SOURCE="12" NAME="A12345678903" xsi:type="SQLVARYCHAR" />
  <COLUMN SOURCE="13" NAME="A12345678904" xsi:type="SQLVARYCHAR" />
  <COLUMN SOURCE="14" NAME="A1234" xsi:type="SQLVARYCHAR" />
 </ROW>
</BCPFORMAT>

我已将 CSV 文件的屏幕截图包含在文本文件中

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

【问题讨论】:

  • 在我创建了一个包含两个字段和 19 行的虚拟 .csv 文件后,这对我来说很好,在 SQL 中设置了一个具有匹配模式的表,为该表创建了一个 .fmt 文件并运行与您上面相同的命令(尽管我的 .csv 和 .fmt 文件的文件路径不同)。也许您可以发布您的 .csv 和 .fmt 文件的样本,以便我们重现问题?
  • FWIW,在我的测试的 DefaultDir 中,目录后面没有\;。示例:DefaultDir=D:\Data\sample
  • @3N1GM4 感谢您的洞察力,我已更新代码以获取更多信息。
  • @WEI_DBA 感谢您的洞察力,我也尝试删除斜杠(/),一开始很慢,然后弹出错误。
  • 如果您在文本编辑器中打开.CSV,它会是什么样子?我怀疑格式文件中的分隔符应该是 ',',而不是 '","',因为您的 CSV 文件可能没有将每个值都用双引号括起来。

标签: sql sql-server-2008 csv


【解决方案1】:

这是因为 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 文件更改为那种格式吗?我说的对吗?
  • 哇!它做了!谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-29
  • 1970-01-01
  • 2017-06-21
相关资源
最近更新 更多