目前我正在阅读一个特定的.csv,并且他们每个人都需要帮助我是一个新手编码器。 对于此示例,我需要读取文件夹中存在的所有.csv文件
我现有的代码
class Program
{
static void Main(string[] args)
{
string csv_file_path = @"C:\Sample files\L.csv";
DataTable csvData = GetDataTabletFromCSVFile(csv_file_path);
}
}
我建议使用DirectoryInfo
查找给定目录中的所有文件。 DirectoryInfo
本质上是一个对象,它包含有关目录中所有文件和目录的信息。您可以使用DirectoryInfo
的GetFiles
函数遍历该目录中的所有文件,并查找CSV文件。从那里开始,只需要做任何你打算对每个文件做的事情。
Directory Info Documentation Link
另外,我注意到你在这里使用绝对路径:
string csv_file_path = @"C:\Sample files\L.csv";
这通常被认为是不好的做法,并且有充分的理由。如果这个程序是在你正在编程的机器以外的任何机器上运行会发生什么?对于这种事情,使用相对路径而不是绝对路径可能更好,这样您的代码可以更普遍地工作。相对路径听起来是相对于当前文件位置的路径。
Here是一篇关于你的相对和绝对路径的文章,以便你想要了解更多相关信息。如果你仍然对此感到困惑,谷歌搜索还可以提供帮助。
我认为这适合你
List<string> directory = Directory.EnumerateFiles(folderPath, "*.csv");
if (directory.Count() != 0)
{
foreach (string filePath in directory)
{
DataTable csvDataTable = GetDataTablefromCSV(filePath);
}
}
csv功能
public static DataTable GetDataTablefromCSV(string filePath)
{
try
{
StreamReader _streamReader = new StreamReader(filePath);
string[] headers = _streamReader.ReadLine().Split(',');
DataTable dataTable = new DataTable();
foreach (string header in headers)
{
dataTable.Columns.Add(header);
}
while (!_streamReader.EndOfStream)
{
string[] rows = Regex.Split(_streamReader.ReadLine(), ",(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)");
DataRow dataRow = dataTable.NewRow();
for (int i = 0; i < headers.Length; i++)
{
dataRow[i] = rows[i];
}
dataTable.Rows.Add(dataRow);
}
return dataTable;
}
catch(Exception ex)
{
return null;
}
}
我修改了代码以使用多个csv文件。请参阅以下更改
using System;
using System.Collections.Generic;
using System.Collections;
using System.Linq;
using System.Text;
using System.Data;
using System.IO;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
string csv_file_path = @"C:\Sample files";
DataTable csvData = new DataTable();
string[] files = Directory.GetFiles(csv_file_path, "*.csv");
Boolean firstFile = true;
foreach (string file in files)
{
GetDataTabletFromCSVFile(file, csvData, firstFile);
firstFile = false;
}
}
private static void GetDataTabletFromCSVFile(string csv_file_path, DataTable csvData, Boolean firstFile)
{
try
{
int lineCount = 0;
using (StreamReader csvReader = new StreamReader(csv_file_path))
{
string line = "";
while ((line = csvReader.ReadLine()) != null)
{
string[] colFields = line.Split(new char[] { ',' }).ToArray();
if (++lineCount == 1)
{
if (firstFile)
//read column names
foreach (string column in colFields)
csvData.Columns.Add(column, typeof(string));
}
else
{
//Making empty value as null
for (int i = 0; i < colFields.Length; i++)
if (colFields[i] == "")
colFields[i] = null;
csvData.Rows.Add(colFields);
}
}
}
}
catch (Exception) { }
}
}
}