C# 仅读取CSV文件C中的数字#
我有一个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文件中仅存储数值 我想通过操作这里的代码来实现这一点: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文件中仅存储
或者有没有更简单的方法来读取和存储数字?这相当简单,只需使用逗号循环文件拆分的行,然后使用
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等等。他的数字不是整数