获取 CSV 文件列表,然后将它们批量插入到表中

Posted

技术标签:

【中文标题】获取 CSV 文件列表,然后将它们批量插入到表中【英文标题】:Grabbing a list of CSV files then bulk inserting them into a table 【发布时间】:2021-12-26 23:47:29 【问题描述】:

我有一个 CSV 文件文件夹,我正尝试将其批量插入到已创建的表中。起初我以为问题在于本地硬盘驱动器中没有 CSV,但看起来我也添加了其他东西。

我正在运行的查询如下:

DECLARE @ALLFILENAMES TABLE (WHICHPATH VARCHAR(255),WHICHFILE varchar(255))
declare @filename varchar(255),
        @path     varchar(255),
        @sql      varchar(8000),
        @cmd      varchar(1000)


--get list of files to process
SET @path = 'C:\Invoices\IGG_Data_StoreNum\X05\'
SET @cmd = 'dir ' + @path + '*.csv" /b'
INSERT INTO  @ALLFILENAMES(WHICHFILE)
EXEC Master..xp_cmdShell @cmd
UPDATE @ALLFILENAMES SET WHICHPATH = @path where WHICHPATH is null

SELECT * FROM @ALLFILENAMES 

--cursor loop
declare c1 cursor 
for SELECT WHICHPATH,WHICHFILE 
FROM @ALLFILENAMES
open c1
fetch next from c1 into @path,@filename
While @@fetch_status <> -1
  begin

--make a query and execute
   set @sql = 'BULK INSERT [SVTTASKS].[dbo].[OOS_AWG_X05] FROM ''' + @path + @filename + ''' '
       + '     WITH (firstrow = 2,
                fieldterminator = '','', 
                rowterminator=''\n'')'
print @sql
exec (@sql)

  fetch next from c1 into @path,@filename
  end
close c1
deallocate c1

收到的错误是:

(受影响的 7 行)

(受影响的 7 行)

(受影响的 7 行)

BULK INSERT [SVTTASKS].[dbo].[OOS_AWG_X05] FROM 'C:\Invoices\IGG_Data_StoreNum\X05\ 驱动器 C 中的卷没有标签。'与(第一行 = 2, 字段终止符 = ',', rowterminator='\n') 消息 4860,级别 16,状态 1,行 1 无法批量加载。驱动器 C 中的文件“C:\Invoices\IGG_Data_StoreNum\X05\ 卷没有标签。”不存在。

批量插入 [SVTTASKS].[dbo].[OOS_AWG_X05] FROM 'C:\Invoices\IGG_Data_StoreNum\X05\ 卷序列号为 1653-5277' WITH (firstrow = 2, 字段终止符 = ',', rowterminator='\n') 消息 4860,级别 16,状态 1,行 1 无法批量加载。文件“C:\Invoices\IGG_Data_StoreNum\X05\ Volume Serial Number is 1653-5277”不存在。

BULK INSERT [SVTTASKS].[dbo].[OOS_AWG_X05] FROM 'C:\Invoices\IGG_Data_StoreNum\X05\ Directory of C:\Invoices\IGG_Data_StoreNum\X05*.csv ' WITH (firstrow = 2, 字段终止符 = ',', rowterminator='\n') Msg 4861, Level 16, State 1, Line 1 无法批量加载,因为文件“C:\Invoices\IGG_Data_StoreNum\X05\ Directory of C:\Invoices\IGG_Data_StoreNum\X05*.csv”不能被打开。操作系统错误代码123(文件名、目录名或卷标语法不正确。)。

批量插入 [SVTTASKS].[dbo].[OOS_AWG_X05] FROM 'C:\Invoices\IGG_Data_StoreNum\X05\File Not Found' WITH(第一行 = 2, 字段终止符 = ',', rowterminator='\n') 消息 4860,级别 16,状态 1,行 1 无法批量加载。文件“C:\Invoices\IGG_Data_StoreNum\X05\File Not Found”不存在。

【问题讨论】:

很明显,您的 dir 命令正在从 dir 返回您不期望的额外输出。但即使没有这个,这也是一团糟。使用 PowerShell。 刚抢到first "answer" from searching 是的,我确实从另一个答案中获取了大部分内容。然后根据我的需要进行修改。在 dir 命令注释后发现问题。文件类型后的引用很合适。其他一切都像冠军一样工作,并且桌子已加载。非常感谢 Stack Overflow 社区。​​span> PRINT @cmd; 将是一个非常宝贵的调试工具。 :-) 【参考方案1】:

文件类型后的引号很合适。其他一切都像冠军一样工作,并且桌子已加载。非常感谢 Stack Overflow 社区。​​p>

DECLARE @ALLFILENAMES TABLE (WHICHPATH VARCHAR(255),WHICHFILE varchar(255))
declare @filename varchar(255),
        @path     varchar(255),
        @sql      varchar(8000),
        @cmd      varchar(1000)



--get list of files to process
SET @path = 'C:\Invoices\IGG_Data_StoreNum\X05\'
SET @cmd = 'dir ' + @path + '*.csv /b'
INSERT INTO  @ALLFILENAMES(WHICHFILE)
EXEC Master..xp_cmdShell @cmd
UPDATE @ALLFILENAMES SET WHICHPATH = @path where WHICHPATH is null

SELECT * FROM @ALLFILENAMES 


--cursor loop
declare c1 cursor 
for SELECT WHICHPATH,WHICHFILE 
FROM @ALLFILENAMES
open c1
fetch next from c1 into @path,@filename
While @@fetch_status <> -1
  begin


--make a query and execute
   set @sql = 'BULK INSERT [SVTTASKS].[dbo].[OOS_AWG_X05] FROM ''' + @path + @filename + ''' '
       + '     WITH (firstrow = 2,
                fieldterminator = '','', 
                rowterminator=''\n'')'
print @sql
exec (@sql)

  fetch next from c1 into @path,@filename
  end
close c1
deallocate c1

【讨论】:

以上是关于获取 CSV 文件列表,然后将它们批量插入到表中的主要内容,如果未能解决你的问题,请参考以下文章

如何在 MySQL 中进行批量插入

在读取和绑定多个文件时将“文件名”列添加到表中

从 CSV 文件填充 Android 数据库?

在实体框架中批量插入后批量插入记录并获取它们的 ID

批量从 SQL Server 检索数据

当标头是动态的时,避免批量数据导出到csv