仅读取CSV文件C#中的数字

时间:2013-05-21 22:15:10

标签: c# csv

我有一个带有值的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

或者是否有更简单的方法来阅读和存储数字?

5 个答案:

答案 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

给出我想要的东西。谢谢大家!