我有一个带有值的CSV文件:
,Vb(M),Ke23(M^-1), AAA,3.91E-06,2.21E+06 BBB,6.65E-03,3.50E+03 CCC,0.213,1503.759398 DDD,1.37E+00,0.00E+00
我想读取文件并仅存储CSV文件中的数字值。
我想通过操作此处的代码来完成此操作:http://www.codeproject.com/Articles/415732/Reading-and-Writing-CSV-Files-in-Csharp
或者是否有更简单的方法来阅读和存储数字?
答案 0 :(得分:3)
这很简单,只需在逗号分割文件的行上循环,然后使用TryParse
循环遍历标记,这样的东西应该可以工作;
List<double> numbers = new List<double>();
double buffer = 0;
while (string line = reader.ReadLine() != null)
{
string[] tokens = line.Split(',');
foreach (string s in tokens)
{
if (double.TryParse(s, out buffer))
numbers.Add(buffer);
}
}
// to print the values with iteration
foreach (double d in numbers)
Console.WriteLine(d.ToString());
// to print with LINQ
numbers.Select(x => Console.WriteLine(x.ToString()));
免责声明:我在浏览器中编写了代码,因此尚未编译或测试。可能需要进行一些小的调整,但这是最简单的方法。
答案 1 :(得分:1)
LINQ解决方案:
var numbers = File.ReadLines("file.txt")
.SelectMany(line => line.Split(','))
.Select(token =>
{
double value;
return double.TryParse(token, out value) ? (double?)value : null;
})
.Where(value => value != null)
.Select(value => value.Value)
.ToList();
答案 2 :(得分:1)
尝试FileHelpers解析CSV文件。它可以轻松地为您提供对文件的强类型访问,因此您可以轻松地将数字值选为简单属性。
以下是使用Filehelpers解析数据的快速示例,以获取第二列。
static void Main(string[] args)
{
var engine = new FileHelperEngine(typeof(MyRecord));
MyRecord[] myRecords = engine.ReadFile("data.csv") as MyRecord[];
var numbers = myRecords.Select(x => x.ColumnB);
foreach (var number in numbers)
{
Console.WriteLine(number);
}
Console.ReadLine();
}
[DelimitedRecord(",")]
public class MyRecord
{
public string ColumnA;
[FieldConverter(typeof(ScientificNotationConverter))]
public double ColumnB;
[FieldConverter(typeof(ScientificNotationConverter))]
public double ColumnC;
}
public class ScientificNotationConverter : ConverterBase
{
public override object StringToField(string @from)
{
return Double.Parse(@from, System.Globalization.NumberStyles.Float);
}
}
答案 3 :(得分:0)
如果我理解你的问题,你可以尝试这样的事情。
注意:这假设一个完美形成的CSV文件,例如您提供的。您需要包含错误检查,否则肯定会在某些时候失败
string[] lines = File.ReadAllLines("MyCsvFile");
Dictionary<string, double> parsedCsv = new Dictionary<string,double>();
// Read the first line
string col1 = "", col2 = "";
if(lines.Length > 0)
{
string[] tokens = lines.Split(',');
col1 = tokens[1];
col2 = tokens[2];
}
for(int i = 1; i < lines.length; i++)
{
string[] tokens = lines.Split(',');
string varName1 = tokens[0] + "." + col1;
string varName2 = tokens[0] + "." + col2;
double value = double.Parse(tokens[1]);
parsedCsv.Add(varName1, value);
value = double.Parse(tokens[2]);
parsedCsv.Add(varname2, value);
}
现在您可以像这样从字典中访问值。
double AAA1 = parsedCsv["AAA.Vb(M)"];
double AAA2 = parsed Csv["AAA.Ke23(M^-1)"]
等等。
请记住,我没有错误检查。我只是展示了一种通过Dictionary&lt;&gt;在运行时将解析后的值与某些变量关联相关联的方法。我没有包括如何使用链接的CsvReader库。如果您对如何使用它有疑问,我会问另一个问题。
答案 4 :(得分:0)
这是我从@ evanmcdonnal的回答中得到的答案:
StreamReader reader = new StreamReader(@"F:\BP1.csv");
List<double> numbers = new List<double>();
double buffer = 0;
while (!reader.EndOfStream)
{
string line = reader.ReadLine();
string[] tokens = line.Split(',');
foreach (string s in tokens)
{
if (double.TryParse(s, out buffer))
numbers.Add(buffer);
}
}
foreach (double d in numbers)
Console.WriteLine(d.ToString());
reader.Close();
输出: 3.91E-06 2210000 0.00665 3500 0.213 1503.759 1.37 0
给出我想要的东西。谢谢大家!