循环遍历目录中的CSV文件并将它们插入Access中

本文关键字:Access 插入 CSV 遍历 循环 文件 | 更新日期: 2023-09-27 18:01:41

我有一个包含大量CSV文件的目录。我想循环遍历目录,并根据每个文件的文件名将它们插入到一个特定的表中。

我能够成功地通过文件循环,但我有一些麻烦插入数据到Access数据库。我相信我已经很接近了。如有任何反馈,将不胜感激。

这是我的代码:

string folderPath = Path.Combine(Path.GetTempPath(), "Reports");
string folderPath2 = Path.GetTempPath() + @"'Reports'";
var dir = new DirectoryInfo(folderPath);
foreach (var fileInfo in dir.EnumerateFiles("crashes_*.csv"))
{
    OleDbCommand cmdBulk = new OleDbCommand(@"INSERT INTO tbl_crashes " +
                    @"SELECT * FROM [Text;FMT=Delimited;HDR=Yes;ACCDB=Yes;Database=" + folderPath2 + "].[" + Directory.GetFiles(folderPath2, "crash*.csv") + "]", MyConn);
    MyConn.Open();
    cmdBulk.ExecuteNonQuery();
    MyConn.Close();
}

这是我收到的错误:

name 'System.String['.

循环遍历目录中的CSV文件并将它们插入Access中

故障排除101:当"出现问题"时,将问题分解以隔离原因。

在本例中,错误

name 'System.String['.

是一个非常强烈的暗示,表明我们粘合在一起的CommandText字符串有问题,所以让我们看看字符串本身的相关位。

string folderpath2 = @"C:'__tmp'";
string str = "stuff [" + folderpath2 + "].[" + Directory.GetFiles(folderpath2, "zzzTest*.csv") + "] more_stuff";
Console.WriteLine(str);

生产

stuff [C:'__tmp'].[System.String[]] more_stuff

,因此我们可以看到字符串连接对GetFiles方法调用的结果执行隐式ToString,返回"System.String[]"。也就是说,GetFiles返回一个字符串数组,隐式ToString告诉我们结果,而不是它包含的

所以这解释了错误:额外的方括号使OleDb提供程序不高兴。

然而,解决方案是使用foreach循环为我们提供的FileInfo对象的Name属性
string folderpath2 = @"C:'__tmp'";
var di = new DirectoryInfo(folderpath2);
foreach (FileInfo fi in di.EnumerateFiles("zzzTest*.csv"))
{
    string str = "stuff [" + folderpath2 + "].[" + fi.Name + "] more_stuff";
    Console.WriteLine(str);
}

生产
stuff [C:'__tmp'].[zzzTest1.csv] more_stuff
stuff [C:'__tmp'].[zzzTest2.csv] more_stuff