根据标头从CSV获取值

时间:2014-05-14 13:03:05

标签: c# csv

我有一个包含此数据的csv文件

Price,volume,"Local, Zones 1 & 2",Zone 3,Zone 4,Zone 5,Zone 6,Zone 7,Zone 8,Zone 9
1,0.1,4.58,4.65,4.74,4.99,5.23,5.47,5.82,6.98
2,0.2,4.99,5.12,5.28,5.5,5.7,5.91,6.3,7.56
3,0.3,5.22,5.61,6.12,7.64,8.39,9.09,9.96,11.94
4,0.4,5.4,6.31,7.24,9.13,10.73,11.77,13.26,15.91
5,0.5,6.18,7.21,8.35,11.5,13.41,14.82,16.97,20.36

现在我想根据音量和区域检索值。如果音量为0.1且区域为1,则我应该得到值4.58.类似地,如果音量为0.5且xone为2,那么值应为6.18。

我怎样才能在c#中做到这一点?

3 个答案:

答案 0 :(得分:3)

假设文件的格式不会改变且csv文件有效。

int zone = 1;
double value = 0.1;

int zoneColumnIndex = Math.Max(zone, 2);
string valueString = value.ToString(CultureInfo.InvariantCulture);
string result = File.ReadLines("sample.txt")
                    .Skip(1)
                    .Select(s => s.Split(','))
                    .Where(t => t[1] == valueString)
                    .Select(t => t[zoneColumnIndex])
                    .FirstOrDefault();

答案 1 :(得分:1)

将值输入数组或列表

 var reader = new StreamReader(File.OpenRead(@"C:\test.csv"));
    List<string> listA = new List<string>();
    int i = 0;
    while (!reader.EndOfStream)
    {
        var line = reader.ReadLine();
        var values = line.Split(',');

        listA.Add(values[i]);
        i += 1;
    }

现在使用您的列表来通过

进行迭代
foreach(int j in listA)
{
try
{/* do stuff */}
catch
{/* if your csv cotains strings it wall fall in here */}
}

答案 2 :(得分:1)

如果我是你,我会看“LinqToExcel”。然后你可以这样做:

var csv = new LinqToExcel.ExcelQueryFactory(csvFile);

var query =
    from row in csv.Worksheet()
    let Volume = row["volume"].Cast<double>()
    where Volume == 0.1
    select new
    {
        Price = row["Price"].Cast<int>(),
        Volume,
        Local = row["Local, Zones 1 & 2"].Cast<decimal>(),
        Zone3 = row["Zone 3"].Cast<decimal>(),
        //etc
    };