Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#从CSV文件中读取特定值_C#_Csv - Fatal编程技术网

C#从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;

我是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;
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"];
}