我有一个 C# DLL,它已经使用
CsvHelper
来读取 CSV 文件。所以我想知道 CsvHelper
是否有能力让我简单地传递一个 string
(不是 文件)并返回令牌列表?
就这样:
2023/11/06,名称,PartType,"“嘿,这是主题!”",1
成为列表:
根据其他一些答案和下面的评论,我最终采用了这种 C# 方法:
public int ParseCSVText(string textToParse, string delimiter, out string[] tokens)
{
List<string> listTokens = new List<string>();
using (var stringReader = new StreamReader(textToParse))
{
var config = new CsvConfiguration(CultureInfo.InvariantCulture);
config.Delimiter = delimiter;
config.HasHeaderRecord = false;
using (var reader = new CsvReader(stringReader, config))
{
while (reader.Read())
{
listTokens.Add(reader.GetField(0));
listTokens.Add(reader.GetField(1));
listTokens.Add(reader.GetField(2));
listTokens.Add(reader.GetField(3));
listTokens.Add(reader.GetField(4));
}
}
}
tokens = listTokens.ToArray();
return listTokens.Count;
}
相关的 C++ 包装器:
bool CMSATools::ParseCSVText(const int fieldCount, const CString textToParse, const CString delimiter, CStringArray& listTokens)
{
SAFEARRAY* saTokens = nullptr;
if (m_pInterface != nullptr)
{
long count{};
const auto hr = m_pInterface->ParseCSVText(textToParse.AllocSysString(), delimiter.AllocSysString(), &saTokens, &count);
if (SUCCEEDED(hr))
ConvertSAFEARRAY<BSTR, CStringArray>(saTokens, listTokens);
else
throw_if_fail(hr);
}
return listTokens.GetSize() == fieldCount;
}
但是当我运行我的代码时,例如:
theApp.MSAToolsInterface().ParseCSVText(5, lineText, strDelimiter, listFields)
并进入调试,C# 的
HRESULT
表示无法找到 文件。没有文件 - 它是一个字符串。 🧐
这是最终的方法:
public int ParseCSVText(string textToParse, string delimiter, out string[] tokens)
{
List<string> listTokens = new List<string>();
try
{
using (var stringReader = new StringReader(textToParse))
{
var config = new CsvConfiguration(CultureInfo.InvariantCulture);
config.Delimiter = delimiter;
config.HasHeaderRecord = false;
using (var reader = new CsvReader(stringReader, config))
{
while (reader.Read())
{
for (int column = 0; column < reader.ColumnCount; column++)
{
listTokens.Add(reader.GetField(column));
}
}
}
}
}
catch (Exception ex)
{
SimpleLog.Log(ex);
}
tokens = listTokens.ToArray();
return listTokens.Count;
}