在.NET Core 1中TextFieldParser的替代方法

17

过去,在c# .net MVC项目中,我使用了来自Visual Basic参考的TextFieldParser。 现在有了.Net Core 1,似乎不再是一个选择。 至少我无法想出如何添加Visual Basic引用,如果你这样做了,它是否会使它不跨平台呢?

TextFieldParser非常好,因为它具有很大的灵活性,可以满足我所有的CSV导入需求。

在.netCore中,是否有替代TextFieldParser的选项?或者是否有一种方法可以在不破坏跨平台兼容性的情况下使用当前的textfieldparser?


1
使用Reflector或ILSpy来反汇编TextFieldParser类。这两个产品都输出C#,因此您应该能够在项目中重建它。 - Sam Axe
@SamAxe 感谢你的建议。我也会尝试一下。 - Xaxum
5个回答

5

我刚刚尝试了CsvHelper - 一个 .NET 库,用于 读取写入 CSV 文件。它能满足所有需求。看起来快速、灵活且 易于使用。支持读取和写入自定义类对象。 它能与.NET Core (因为它支持 .NET Standard 2.0) 以及 .NET Framework 4.5 很好地配合使用,请查看 NuGet 页面 上的依赖关系。


这太棒了! - BinaryPatrick

4
如果需要的话,TextFieldParser 不仅仅能够处理CSV格式,还支持制表符分隔、固定宽度字段等等。我为.NET Core创建了一个1对1的端口以支持该功能。你可以通过搜索 TextFieldParserCore 获取nuget版本。 https://www.nuget.org/packages/TextFieldParserCore/1.0.0

你真是救星啊……我真的不想从2.0升级到3,或者改变我的代码以使用不同的解析器。 - james murphy

4

.NET Core 3 新增了此功能支持。


找到了。可以在包含以下代码后使用:using Microsoft.VisualBasic.FileIO; - Crouching Kitten

0
我有一个无法升级且不想添加大型库或重写方法的.NET Standard 2.0项目。我从NuGet中添加了TextFieldParserStandard,它没有添加任何额外的依赖项。唯一的代码修改是将命名空间从Microsoft.VisualBasic.FileIO更改为TextFieldParserStandard。

-1

解析CSV字符串或文件是一个相当简单的任务。循环遍历所有行并在分隔符字符处使用String.Split进行拆分。无论您是否使用库来为您完成此操作,这取决于您。

这是我想出的一个非常灵活的TextReader扩展方法:

using System;
using System.Collections.Generic;
using System.IO;

namespace Extensions
{
    /// <summary>Extension method to parse any character separated string OR file.</summary>
    /// <param name="mapFunction">Expression to map data to the desired format</param>
    /// <param name="separator">The character delimiting columns</param>
    /// <param name="skipLines">Amount of heading lines to skip</param>
    public static class TextReaderExtensions
    {
        public static IEnumerable<T> ParseCsvData<T>(this TextReader reader, Func<string[], T> mapFunction, char separator = ',', short skipLines = 1)
        {
            IEnumerable<string[]> readCsvLines()
            {
                string line;
                while ((line = reader.ReadLine()) != null)
                {
                    if (!string.IsNullOrEmpty(line) && skipLines-- < 1)
                    {
                        yield return line.Split(separator);
                    }
                }
            }

            foreach (var csvLine in readCsvLines())
            {
                yield return mapFunction.Invoke(csvLine) ?? default;
            }
        }
    }
}

从字符串输入的示例用法:

using (var textReader = new StringReader("Comma,Separated,Value,String"))
{
    var persons = textReader.ParseCsvData(columns => new Person
    {
        Id = columns[0],
        Name = columns[1],
        Age = columns[2]
    });

    return persons.ToList();
}

从文件流输入的示例用法:

using (var textReader = new StreamReader(fileStream))
{
    var formattedStrings = textReader.ParseCsvData(data => data[1] + " is " + data[2] + " years old.");
    return formattedStrings.ToList();
}

无限的可能性。

做任何你想做的事情...

人民有力量!!


请注意,此代码无法处理值中包含逗号或换行符的情况。 - Michael
1
请更新您的代码以解析类似于以下格式的csv记录:Comma,"Sepa\r\na,ted",Value,String\r\nNew,Line,Normal,Values - Alb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接