0

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

还是有更简单的方法来读取和存储数字?

4

5 回答 5

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()));

免责声明:我在浏览器中编写了代码,因此尚未编译或测试。一些小的调整可能是必要的,但这几乎是最简单的方法。

于 2013-05-21T22:18:47.860 回答
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);
        }
    }
于 2013-05-21T23:01:40.637 回答
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();
于 2013-05-21T22:44:34.667 回答
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<> 将解析的值与一些变量关联关联的方法。我没有包括如何使用链接的 CsvReader 库。如果您对如何使用它有特别的疑问,我会问另一个问题。

于 2013-05-21T23:04:37.763 回答
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

给出了我一直在寻找的东西。感谢大家!

于 2013-05-22T17:40:02.650 回答