【发布时间】:2020-02-04 13:40:43
【问题描述】:
我这里有这段代码可以按我的方式工作,但我正在.Net Standard 上开发,不能使用Microsoft.VisualBasic.FileIO 库。我希望能够使用CsvHelper 做同样的事情
是否可以使用CsvHelper 来,首先获取标题行作为字符串数组。其次,将每一行作为一个字符串数组来获取?
using Microsoft.VisualBasic.FileIO;
using (TextFieldParser csvParser = new TextFieldParser("FilePath"))
{
csvParser.CommentTokens = new string[] { "#" };
csvParser.SetDelimiters(new string[] { "," });
csvParser.HasFieldsEnclosedInQuotes = true;
csvParser.TrimWhiteSpace = true;
string[] fields = csvParser.ReadFields();
int arraySize = fields.Length;
int index = Array.IndexOf(fields, columnExtracted);
while (!csvParser.EndOfData)
{
fields = csvParser.ReadFields();
string column = fields[index];
Console.WriteLine(column);
}
}
我尝试了以下代码来读取单元格,但由于 string Csv = string.Join("\n", result.ToArray()); 行而在遇到分隔符时会换行
有没有办法将所有信息放在一个数组中?它已经存储在字符串列表中,但我无法通过索引检索数据。
List<string> result = new List<string>();
string value;
using (TextReader fileReader = File.OpenText("FilePath"))
{
var csv = new CsvReader(fileReader, CultureInfo.InvariantCulture);
csv.Configuration.HasHeaderRecord = true;
while (csv.Read())
{
for (int i = 0; csv.TryGetField<string>(i, out value); i++)
{
result.Add(value);
}
if (csv.Read() == false)
break;
}
}
string Csv = string.Join("\n", result.ToArray());
编辑
这是我收到反馈后的新代码。但是,它似乎在遍历存储所有记录的 List 时省略了标题行。
public List<string> HeaderColumnParser(string columnExtracted, string PathToFile)
{
List<string> result = new List<string>();
string value;
using (TextReader fileReader = File.OpenText(PathToFile))
{
var csv = new CsvReader(fileReader, CultureInfo.InvariantCulture);
csv.Read();
csv.ReadHeader();
string[] header = csv.Context.HeaderRecord;
int extractedIndex = Array.IndexOf(header, columnExtracted);
while (csv.Read())
{
string[] row = csv.Context.Record;
string column = row[extractedIndex];
result.Add(column);
}
}
return result;
【问题讨论】:
-
您是否要求我们将此代码转换为使用 CSVHelper?
-
没有必要。我在问是否可以使用 CSVHelper,因为它缺少文档
-
@GotBannedSoImadeAnotherAccount 如果你想将值作为一个数组,你为什么要将它们转换回 string? CsvHelper 的文档就足够了。它展示了如何读取强类型记录、单个字段、匿名对象、动态对象,甚至如何通过 CsvDataReader 将所有内容加载到 DataTable 中。您尝试做的事情很可能是不必要的。这段代码的作用是复制原始文件行,将
,更改为\n -
@GotBannedSoImadeAnotherAccount 参考您最近的编辑,只需在
while (csv.Read())之前添加result.Add(header[extractedIndex])