问题描述
假如有一个准备好的CSV文件,现需要将其中的内容读取到C#的DataTable中,在C#/.NET应用程序编程开发中如何实现呢?
方案一
使用第三方组件,这里为大家推荐的CSV文件帮助组件是:GenericParser。
根据名称可以看出,这是一个泛型的CSV文件解析工具,GenericParser
具有如下的特性:
- 支持分隔和固定宽度格式
- 支持自定义分隔符字符(仅支持单个字符)
- 支持注释行(单个字符标记)
- 支持转义字符(仅支持单个字符)
- 支持自定义文本限定符,允许忽略列/行分隔符(例如,多行数据)
- 通过将转义文本限定符加倍来支持它们
- 支持忽略/包含不包含字符的行
- 支持标题行
- 支持动态添加更多列以匹配数据的功能
- 支持将列的数目强制为特定数目
- 其他更多特性…
使用示例如下:
DataSet dsResult;
// 从xml文件加载解析器的配置参数
using (GenericParserAdapter parser = new GenericParserAdapter("MyData.txt"))
{
parser.Load("MyData.xml");
dsResult = parser.GetDataSet();
}
// 或者以编程的方式配置解析器选项
string strID, strName, strStatus;
using (GenericParser parser = new GenericParser())
{
parser.SetDataSource("MyData.txt");
parser.ColumnDelimiter = "\t".ToCharArray();
parser.FirstRowHasHeader = true;
parser.SkipStartingDataRows = 10;
parser.MaxBufferSize = 4096;
parser.MaxRows = 500;
parser.TextQualifier = '\"';
while (parser.Read())
{
strID = parser["ID"];
strName = parser["Name"];
strStatus = parser["Status"];
}
}
// 编程方式设置列宽
using (GenericParser parser = new GenericParser())
{
parser.SetDataSource("MyData.txt");
parser.ColumnWidths = new int[4] {10, 10, 10, 10};
parser.SkipStartingDataRows = 10;
parser.MaxRows = 500;
while (parser.Read())
{
strID = parser["ID"];
strName = parser["Name"];
strStatus = parser["Status"];
}
}
方案二
使用OleDb
提供程序读取CSV文件,如下:
using System.Data;
using System.Data.OleDb;
using System.Globalization;
using System.IO;
static DataTable GetDataTableFromCsv(string path, bool isFirstRowHeader)
{
string header = isFirstRowHeader ? "Yes" : "No";
string pathOnly = Path.GetDirectoryName(path);
string fileName = Path.GetFileName(path);
string sql = @"SELECT * FROM [" + fileName + "]";
using(OleDbConnection connection = new OleDbConnection(
@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + pathOnly +
";Extended Properties=\"Text;HDR=" + header + "\""))
using(OleDbCommand command = new OleDbCommand(sql, connection))
using(OleDbDataAdapter adapter = new OleDbDataAdapter(command))
{
DataTable dataTable = new DataTable();
dataTable.Locale = CultureInfo.CurrentCulture;
adapter.Fill(dataTable);
return dataTable;
}
}
方案三
使用文件流StreamReader
读取CSC文件,然后手动分割每一行数据,如下:
public static DataTable ConvertCSVtoDataTable(string strFilePath)
{
DataTable dt = new DataTable();
using (StreamReader sr = new StreamReader(strFilePath))
{
string[] headers = sr.ReadLine().Split(',');
foreach (string header in headers)
{
dt.Columns.Add(header);
}
while (!sr.EndOfStream)
{
string[] rows = sr.ReadLine().Split(',');
DataRow dr = dt.NewRow();
for (int i = 0; i < headers.Length; i++)
{
dr[i] = rows[i];
}
dt.Rows.Add(dr);
}
}
return dt;
}
版权声明:本作品系原创,版权归码友网所有,如未经许可,禁止任何形式转载,违者必究。
发表评论
登录用户才能发表评论, 请 登 录 或者 注册