我有一个包含以下数据的csv文件:
500000,0.005,6000
690000,0.003,5200
我需要将每行添加为单独的数组。因此50000、0.005、6000将是array1。我该怎么办?
当前,我的代码将每一列添加到一个元素中。
例如,数据[0]显示为500000 690000
htmlAttributes
答案 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]}");
}
没有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);