C#从CSV文件中读取特定值
我是C#的学习者。我想从CSV文件中读取特定值。我已经学会了如何通过浏览将csv文件放入数据表中。请参阅以下代码(感谢surendra jha)和我的CSV文件格式。比方说,我想得到'ID'=90的'Volume'是多少 CSV文件C#从CSV文件中读取特定值,c#,csv,C#,Csv,我是C#的学习者。我想从CSV文件中读取特定值。我已经学会了如何通过浏览将csv文件放入数据表中。请参阅以下代码(感谢surendra jha)和我的CSV文件格式。比方说,我想得到'ID'=90的'Volume'是多少 CSV文件 ID:Volume:Name 100:5600:A 95:5000:B 90:4500:C 85:4000:D 获取所有值的代码: using System; using System.Collections.Generic; using System.Linq;
ID:Volume:Name
100:5600:A
95:5000:B
90:4500:C
85:4000:D
获取所有值的代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using System.Data;
namespace DVHConsolePrj
{
class Program
{
static void Main(string[] args)
{
readCsvFileData();
}
static void readCsvFileData()
{
string path = @"C:\IDVolumeName.txt";
StreamReader streamreader = new StreamReader(path);
DataTable datatable = new DataTable();
int rowcount = 0;
string[] columnname = null;
string[] streamdatavalue = null;
while (!streamreader.EndOfStream)
{
string streamrowdata = streamreader.ReadLine().Trim();
if (streamrowdata.Length > 0)
{
streamdatavalue = streamrowdata.Split(':');
if (rowcount == 0)
{
rowcount = 1;
columnname = streamdatavalue;
foreach (string csvheader in columnname)
{
DataColumn datacolumn = new DataColumn(csvheader.ToUpper(), typeof(string));
datacolumn.DefaultValue = string.Empty;
datatable.Columns.Add(datacolumn);
}
}
else
{
DataRow datarow = datatable.NewRow();
for (int i = 0; i < columnname.Length; i++)
{
datarow[columnname[i]] = streamdatavalue[i] == null ? string.Empty : streamdatavalue[i].ToString();
}
datatable.Rows.Add(datarow);
}
}
}
streamreader.Close();
streamreader.Dispose();
foreach (DataRow dr in datatable.Rows)
{
string rowvalues = string.Empty;
foreach (string csvcolumns in columnname)
{
rowvalues += csvcolumns + "=" + dr[csvcolumns].ToString() + " ";
}
Console.WriteLine(rowvalues);
}
Console.ReadLine();
}
}
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用System.Threading.Tasks;
使用System.IO;
使用系统数据;
命名空间DVHConsolePrj
{
班级计划
{
静态void Main(字符串[]参数)
{
readCsvFileData();
}
静态void readCsvFileData()
{
字符串路径=@“C:\IDVolumeName.txt”;
StreamReader StreamReader=新的StreamReader(路径);
DataTable=新的DataTable();
int rowcount=0;
字符串[]columnname=null;
字符串[]streamdatavalue=null;
而(!streamreader.EndOfStream)
{
字符串streamrowdata=streamreader.ReadLine().Trim();
如果(streamrowdata.Length>0)
{
streamdatavalue=streamrowdata.Split(“:”);
如果(行计数==0)
{
行数=1;
columnname=streamdatavalue;
foreach(columnname中的字符串csvheader)
{
DataColumn DataColumn=新的DataColumn(csvheader.ToUpper(),typeof(string));
datacolumn.DefaultValue=string.Empty;
datatable.Columns.Add(datacolumn);
}
}
其他的
{
DataRow DataRow=datatable.NewRow();
for(int i=0;i
您可以尝试这段代码,它是动态构建的,可能存在一些小错误。检查OLEDB连接。返回DataTable时,可以使用LINQ在表中搜索
var results = from myRow in myDataTable.AsEnumerable()
where myRow.Field<int>("ID") == 90
select myRow;
var results=来自myDataTable.AsEnumerable()中的myRow
其中myRow.Field(“ID”)==90
选择myRow;
在这里,您可以使用ID=90的行 与其在数据表中手动解析文件,然后执行一些Linq,不如直接在其上使用Linq,使用 它工作得非常好,对于大文件非常有效 比如说 1) 在项目中添加nuget软件包,并使用以下行:
using LINQtoCSV;
2) 定义用于处理数据的类
public class IdVolumeNameRow
{
[CsvColumn(FieldIndex = 1)]
public string ID { get; set; }
[CsvColumn(FieldIndex = 2)]
public decimal Volume { get; set; }
[CsvColumn(FieldIndex = 3)]
public string Name{ get; set; }
}
3) 并搜索值
var csvAttributes = new CsvFileDescription
{
SeparatorChar = ':',
FirstLineHasColumnNames = true
};
var cc = new CsvContext();
var volume = cc.Read<IdVolumeNameRow>(@"C:\IDVolumeName.txt", csvAttributes)
.Where(i => i.ID == "90")
.Select(i => i.Volume)
.FirstOrDefault();
var csvAttributes=新的CsvFileDescription
{
SeparatorChar=':',
FirstLineHasColumnNames=true
};
var cc=new CsvContext();
var volume=cc.Read(@“C:\IDVolumeName.txt”,csvAttributes)
。其中(i=>i.ID==“90”)
.选择(i=>i.Volume)
.FirstOrDefault();
对于筛选数据表,您可以使用如下方法
var filtered = dataTable.Select("ID = '90'");
filtered
上面是适合该条件的数据行数组,因此对于从第一个筛选行获取值,可以使用如下命令
if(filtered.Length>0){
var Volume = filtered[0]["VOLUME"];
}
在google中搜索如何使用C#读取csv文件。这里有一个例子。无论如何,我强烈建议您使用OLEDB连接!您可以使用filteringI的方法。我以前从未见过一个文件带有分隔符
:
。我以为CSV代表逗号分隔的值。谢谢你的帮助……但是,我有一个小问题。。。。使用下面的代码,我可以检索95到85,但不能检索100?我很困惑。下面是替换“foreach(DataRow..”字符串myID;Console.Write(“输入ID:”;myID=Console.ReadLine();var filtered=datatable.Select(string.Format(“ID={0}”,myID));if(filtered.Length>0){var Volume1=filtered[0][“VOLUME”];Console.WriteLine(“卷是:{0}”,卷1);}Console.ReadLine();这是如何回答他的问题的?很简单,我返回数据表中的CSV文件。之后,我使用LINQ查找正确的值。他的问题是明确地如何获取ID 90的卷。您的答案一点也没有涵盖。@Serv现在您可以检查它的方式。我明确地编写了它,他可以为每个值LINQ数据表。现在这就更详细了喜欢它。string myID;Console.Write(“输入ID:”;myID=Console.ReadLine();var filtered=datatable.Select(string.Format(“ID={0}”,myID));if(filtered.Length>0){var Volume1=filtered[0][“VOLUME”];Console.WriteLine(“卷是:{0}”,Volume1);}Console.ReadLine();谢谢..但是,我有一个小问题..使用下面的代码,我可以检索到95到85,但不能检索到100?我很困惑。@kmothpur,尝试将字符串格式更改为string.format(“ID='{0}',myID)
if(filtered.Length>0){
var Volume = filtered[0]["VOLUME"];
}