文件解析,其中数组的一列需要转换为不同的类型

本文关键字:一列 转换 类型 文件 数组 | 更新日期: 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; }
}

对当前代码的建议:

    什么是rawFile ?使用ReadAllLines() 获取行
  1. 遵循。net命名准则。var file = ... not var File =
  2. 不要使用与一般。net类(例如File)相同的名称。命名为fileLines,等等
  3. 不要读取文件两次来获取行号。使用new string[fileLines.Count, 4]
  4. 如果你不使用[,]多维数组,你可以使用LINQ和调用来更容易地分割。
  5. 要在string和int之间转换,您需要int.Parseint.TryParse
  6. 添加错误检查以确保您的行长度正确等

示例代码:

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