如何使用 CsvHelper 将字符串解析为标记列表?

问题描述 投票:0回答:1

我有一个 C# DLL,它已经使用

CsvHelper
来读取 CSV 文件。所以我想知道
CsvHelper
是否有能力让我简单地传递一个
string
不是 文件)并返回令牌列表?

就这样:

2023/11/06,名称,PartType,"“嘿,这是主题!”",1

成为列表:

  1. 2023/11/06
  2. 姓名
  3. 零件类型
  4. “嘿,这就是主题!”
  5. 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
表示无法找到 文件。没有文件 - 它是一个字符串。 🧐

c# csv visual-c++ csvhelper
1个回答
0
投票

这是最终的方法:

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;
}
© www.soinside.com 2019 - 2024. All rights reserved.