文件解析,其中数组的一列需要转换为不同的类型
本文关键字:一列 转换 类型 文件 数组 | 更新日期: 2023-09-27 18:01:54
仍在学习并寻找一些指导-我有一个CSV文件,我正在使用具有两个foreach循环的方法读取我的程序,如下所示:
int i = 0;
int j = 0;
string File = File.ReadAllText("c:''employees.txt");
string[,] filesArray = new string[File.ReadLines("c:''employees.txt").Count(), 4];
foreach (string row in rawFile.Split(''n'))
{
foreach (string col in row.Trim().Split(','))
{
filesArray[i, j] = col;
j++;
}
j = 0;
i++;
}
return filesArray;
很好,我可以简单地显示文本但是CSV文件的格式是
Z0003, EmployeeNameHere, 00001
和我想做一些数学和其他计算基于值在filesArray[2,0]等,但我试图找到什么将是这种情况下的最佳实践。
我可以想到一些看起来不太优雅的方法,老实说,通过谷歌找到这个问题的确切答案有点混乱。我可不想这么早就染上坏习惯!
你现在的问题是你有数据(即使得到它是丑陋的),但它都是在string
s。无论你做什么,你都必须转换成decimal
或其他数字格式来做数学运算。
我建议首先使用FileHelpers这样的库将CSV数据读取到"employee"类中。这将为您提供强类型对象。请参阅左侧的"快速开始分隔"条目。你的类看起来像这样:
[DelimitedRecord(",")]
public class Employee {
// fields in same order as in the file
public string EmployeeId { get; set; }
public string EmployeeName { get; set; }
public int MyNumber { get; set; }
}
对当前代码的建议:
- 什么是
- 遵循。net命名准则。
var file = ...
notvar File =
- 不要使用与一般。net类(例如File)相同的名称。命名为
fileLines
,等等 - 不要读取文件两次来获取行号。使用
new string[fileLines.Count, 4]
- 如果你不使用
[,]
多维数组,你可以使用LINQ和调用来更容易地分割。 - 要在string和int之间转换,您需要
int.Parse
或int.TryParse
- 添加错误检查以确保您的行长度正确等
rawFile
?使用ReadAllLines() 获取行示例代码:
var data = fileLines.Select(line => line.Split(','))
.Where(arr => arr.Length == 4) // should have 4 fields
.ToArray();
var xxxx = data[0][1]; // should be "EmployeeNameHere"
// this assumes your data is ALL valid
var numbers = data.Select(x => int.Parse(x[2])).ToList();
var sum = numbers.Sum();
// there is no "pretty" way to do TryParse
var numbers = new List<int>();
foreach(var arr in data) {
int temp = 0;
if (int.TryParse(arr[2], out temp)) {
numbers.Add(temp);
}
}