文件解析数组的一列需要转换为其他类型的位置

时间:2014-05-06 01:27:05

标签: c# file parsing csv

还在学习并寻找一些指导 - 我有一个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]等中的值进行一些数学和其他计算,但我正在尝试找到这种情况的最佳实践。

我可以想到一些似乎并不优雅和诚实的方法,试图通过谷歌找到这个问题的确切答案有点乱。我不想在这么早的阶段养成坏习惯!

1 个答案:

答案 0 :(得分:0)

你现在的问题是你有数据(即使它很难看),但它都在string中。无论你做什么,你都必须转换为decimal或其他数字格式来对其进行数学运算。

我建议使用像FileHelpers这样的库来将您的CSV数据读入"员工"先上课。这将为您提供强类型对象。请参阅'快速入门分隔'进入左侧。你的班级看起来像这样:

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

对当前代码的建议:

  1. 什么是rawFile?你使用ReadAllLines()
  2. 得到了这些行
  3. 遵循.NET命名准则。 var file = ...不是var File =
  4. 请勿使用与常见.Net类相同的名称(例如文件)。称之为fileLines
  5. 不要两次读取文件以获得行数。使用new string[fileLines.Count, 4]
  6. 如果您不使用[,]多维数组,则可以使用LINQ和分割更轻松。
  7. 要在字符串和整数之间进行转换,您需要int.Parseint.TryParse
  8. 添加错误检查以确保您的行长度正确等
  9. 一些示例代码:

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