将csv文件中的两行添加到数组

时间:2018-10-04 06:28:23

标签: c#

我有一个包含以下数据的csv文件:

500000,0.005,6000

690000,0.003,5200

我需要将每行添加为单独的数组。因此50000、0.005、6000将是array1。我该怎么办?

当前,我的代码将每一列添加到一个元素中。

例如,数据[0]显示为500000                                    690000

htmlAttributes

3 个答案:

答案 0 :(得分:1)

使用您提供的有限数据集...

const string test = @"500000,0.005,6000
690000,0.003,5200";

var result = test.Split('\n')
                 .Select(x=> x.Split(',')
                              .Select(y => Convert.ToDecimal(y))
                              .ToArray()
                        )
                 .ToArray();

foreach (var element in result)
{
    Console.WriteLine($"{element[0]}, {element[1]}, {element[2]}");
}

enter image description here


没有LINQ可以完成吗?是的,但是很乱...

const string test = @"500000,0.005,6000
690000,0.003,5200";

List<decimal[]> resultList = new List<decimal[]>();

string[] lines = test.Split('\n');

foreach (var line in lines)
{
    List<decimal> decimalValueList =  new List<decimal>();
    string[] splitValuesByComma = line.Split(',');

    foreach (string value in splitValuesByComma)
    {
        decimal convertedValue = Convert.ToDecimal(value);
        decimalValueList.Add(convertedValue);
    }

    decimal[] decimalValueArray = decimalValueList.ToArray();

    resultList.Add(decimalValueArray);
}

decimal[][] resultArray = resultList.ToArray();

这将提供与第一个示例完全相同的输出

答案 1 :(得分:0)

如果您可以使用List<string[]>,则不必担心数组的长度。 在下面的示例中,变量lines将是一个列表数组,例如:

[“ 500000”,“ 0.005”,“ 6000”]

[“ 690000”,“ 0.003”,“ 5200”]

static void ReadFromFile(string filePath)
{
    try
    {
        // Create an instance of StreamReader to read from a file.
        // The using statement also closes the StreamReader.
        using (StreamReader sr = new StreamReader(filePath))
        {
            List<string[]> lines = new List<string[]>();
            string line;
            // Read and display lines from the file until the end of 
            // the file is reached.
            while ((line = sr.ReadLine()) != null)
            {
                string[] splittedLine = line.Split(',');
                lines.Add(splittedLine);
            }
        }
    }
    catch (Exception e)
    {
        // Let the user know what went wrong.
        Console.WriteLine("The file could not be read:");
        Console.WriteLine(e.Message);
    }
}

答案 2 :(得分:0)

当其他方法具有split方法时,我将使用更多的“ scolar”-“ specified”方法。 您在文件中有一些Csv值。为存储在Csv中的该对象找到一个名称,为每一列命名,然后键入它们。 定义这些字段的默认值。定义缺少列和格式错误的字段会发生什么情况。标头?

现在,您知道自己拥有什么,定义所需的东西。这次再次:对象名称->属性->类型。

信不信由你,您对输入和输出的简单定义解决了您的问题。 使用CsvHelper简化代码。

CSV文件定义:

public class CsvItem_WithARealName
{
    public int data1;
    public decimal data2;
    public int goodVariableNames;
}

public class CsvItemMapper : ClassMap<CsvItem_WithARealName>
{
    public CsvItemMapper()
    {   //mapping based on index. cause file has no header.
        Map(m => m.data1).Index(0);
        Map(m => m.data2).Index(1);
        Map(m => m.goodVariableNames).Index(2);
    }
}

一个Csv阅读器方法,指向一个文档,它将提供您的Csv项。 这里我们有一些配置:没有标头和用于十进制转换的InvariantCulture

private IEnumerable<CsvItem_WithARealName> GetCsvItems(string filePath)
{
    using (var fileReader = File.OpenText(filePath))
    using (var csvReader = new CsvHelper.CsvReader(fileReader))
    {
        csvReader.Configuration.CultureInfo = CultureInfo.InvariantCulture;
        csvReader.Configuration.HasHeaderRecord = false;
        csvReader.Configuration.RegisterClassMap<CsvItemMapper>();
        while (csvReader.Read())
        {
            var record = csvReader.GetRecord<CsvItem_WithARealName>();
            yield return record;
        }
    }
}

用法:

var filename = "csvExemple.txt";
var items = GetCsvItems(filename);