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

C# 仅读取CSV文件C中的数字#,c#,csv,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 ,Vb(M),Ke23(M^-1), AAA,3.91E-06,2.21E+06 BBB,6.65E-03,3.50E+03 CCC,0.2131503.759398 DDD,1.37E+00,0.00E+00 我想读取该文件并在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 ,Vb(M),Ke23(M^-1), AAA,3.91E-06,2.21E+06 BBB,6.65E-03,3.50E+03 CCC,0.2131503.759398 DDD,1.37E+00,0.00E+00 我想读取该文件并在CSV文件中仅存储数值

我想通过操作这里的代码来实现这一点:


或者有没有更简单的方法来读取和存储数字?

这相当简单,只需使用逗号循环文件拆分的行,然后使用
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()));
列表编号=新列表();
双缓冲区=0;
while(string line=reader.ReadLine()!=null)
{
string[]tokens=line.Split(',');
foreach(令牌中的字符串s)
{
if(双锥虫(s,输出缓冲区))
添加(缓冲区);
}
}
//使用迭代打印值的步骤
foreach(数字为双d)
Console.WriteLine(d.ToString());
//用LINQ打印
选择(x=>Console.WriteLine(x.ToString());

免责声明:我在浏览器中编写了代码,所以它还没有被编译或测试。可能需要进行一些小的调整,但这几乎是最简单的方法。

这相当简单,只需在文件拆分的行上循环使用逗号,然后使用
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()));
列表编号=新列表();
双缓冲区=0;
while(string line=reader.ReadLine()!=null)
{
string[]tokens=line.Split(',');
foreach(令牌中的字符串s)
{
if(双锥虫(s,输出缓冲区))
添加(缓冲区);
}
}
//使用迭代打印值的步骤
foreach(数字为双d)
Console.WriteLine(d.ToString());
//用LINQ打印
选择(x=>Console.WriteLine(x.ToString());
免责声明:我在浏览器中编写了代码,所以它还没有被编译或测试。可能需要进行一些小的调整,但这几乎是最简单的方法。

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();
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();
尝试解析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);
        }
    }
尝试解析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);
        }
    }

如果我没弄错你的问题,你可以试试这样的

注意:这假设您提供了一个格式完美的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);
}
等等


请记住,我没有错误检查。我只是展示了一种在运行时通过字典将解析的in值与一些变量关联起来的方法。我没有包括如何使用链接的CsvReader库。如果您有关于如何使用它的具体问题,我会问另一个问题。

如果我正确理解您的问题,您可以尝试类似的方法

注意:这假设您提供了一个格式完美的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);
}
等等


请记住,我没有错误检查。我只是展示了一种在运行时通过字典将解析的in值与一些变量关联起来的方法。我没有包括如何使用链接的CsvReader库。如果您有关于如何使用它的具体问题,我会问另一个问题。

以下是我从@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();
StreamReader=newstreamreader(@“F:\BP1.csv”);
列表编号=新列表();
双缓冲区=0;
而(!reader.EndOfStream)
{
字符串行=reader.ReadLine();
string[]tokens=line.Split(',');
foreach(令牌中的字符串s)
{
if(双锥虫(s,输出缓冲区))
添加(缓冲区);
}
}
foreach(数字为双d)
Console.WriteLine(d.ToString());
reader.Close();
输出: 3.91E-06 2210000 0.00665 3500 0.213 1503.759 1.37 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();
StreamReader=newstreamreader(@“F:\BP1.csv”);
列表编号=新列表();
双缓冲区=0;
而(!reader.EndOfStream)
{
字符串行=reader.ReadLine();
string[]tokens=line.Split(',');
foreach(令牌中的字符串s)
{
if(双锥虫(s,输出缓冲区))
添加(缓冲区);
}
}
foreach(数字为双d)
Console.WriteLine(d.ToString());
reader.Close();
输出: 3.91E-06 2210000 0.00665 3500 0.213 1503.759 1.37 0


给了我想要的。谢谢大家

当你说“只存储数值”时,你能解释一下你的意思吗。可能包括您希望CSV看起来像instad的另一块内容?(像我那样将文本包装在
中,粘贴后看起来很漂亮。)我有一些变量,我声明它们等于:so AAA.Vb=3.91E-6和AAA.Ke23=2.21E6等等当你说“只存储数值”时,你能解释一下你的意思吗。可能包括您希望CSV看起来像instad的另一块内容?(像我那样用
包装文本,粘贴后看起来不错。)我有一些变量,我声明它们等于:so AAA.Vb=3.91E-6和AAA.Ke23=2.21E6等等。他的数字不是整数