我有一个包含此数据的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#中做到这一点?
答案 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
};