使用C#搜索CSV文件并在其旁边的列中提取值

时间:2018-02-15 13:41:02

标签: c# .net winforms csv

我正在尝试创建一个正在编写的程序(Visual Studio中的C#)在外部CSV文件中查找值,并将下一列中的值拉回到WinForm中的标签中。

我的CSV文件是一个带有虚拟数据的测试,它是:

> old,newuser,newpassword
> firstlinetomakesure,firstnewusername,firstnewpassword
> adslusernameplaintext,thisisthenewuser,andthisisthenewpassword
> hello,terion,nadiomn
> somethingdownhere,thisisthelastuser,andthisisthelastpassword 
> 11,12,13
> 21,22,23 
> 31,32,33

我尝试在下面的链接中使用解决方案,但只能返回最后一行第二列中的值。

Search value in csv file using c#

我一直在尝试让程序在“旧”列中搜索值,然后从匹配行的“newuser”列中提取值。然后这将进入WinForm中的标签。

任何示例代码或建议都将受到赞赏。

4 个答案:

答案 0 :(得分:2)

使用CSV库读取CSV文件。我喜欢这个https://joshclose.github.io/CsvHelper/

阅读CSV文件并不像看起来那么简单。第一个难点是值可以包含逗号。步骤很简单,创建一个C#类来保存您的数据,将其映射到您在CSV文件中看到的数据,然后调用CSV库。我链接的页面有足够的示例向您展示如何执行此操作。

答案 1 :(得分:0)

使用Nuget Package Manager控制台获取LinqToExcel  复制代码 PM>安装包LinqToExcel

void PrintArtistAlbums()
{
    string pathToExcelFile = ""
        + @"D:\Code\Blog Projects\BlogSandbox\ArtistAlbums.xlsx";

    string sheetName = "Sheet1";

    var excelFile = new ExcelQueryFactory(pathToExcelFile);
    var artistAlbums = from a in excelFile.Worksheet(sheetName) select a;

    foreach (var a in artistAlbums)
    {
        string artistInfo = "Artist Name: {0}; Album: {1}";
        Console.WriteLine(string.Format(artistInfo, a["Name"], a["Title"]));
    }
}

答案 2 :(得分:0)

这是一个有趣的,在.Net中原生可用,但隐藏在Microsoft.VisualBasic.FileIO命名空间中:TextFieldParser。这样可以读取与MS Office生成的内容完全相同的内容,甚至可以处理值内的换行符。

public static List<String[]> SplitFile(String filePath, Encoding textEncoding, Char separator)
{
    String fileContents = File.ReadAllText(filePath, textEncoding);
    List<String[]> splitLines = new List<String[]>();
    try
    {
        using (StringReader sr = new StringReader(fileContents))
        using (TextFieldParser tfp = new TextFieldParser(sr))
        {
            tfp.TextFieldType = FieldType.Delimited;
            tfp.Delimiters = new String[] { separator.ToString() };
            while (true)
            {
                String[] curLine = tfp.ReadFields();
                if (curLine == null)
                    break;
                splitLines.Add(curLine);
            }
        }
        return splitLines;
    }
    catch (MalformedLineException mfle)
    {
        throw new FormatException(String.Format("Could not parse line {0} in file {1}!", mfle.LineNumber, filePath));
    }
}

解析失败时自带方便的MalformedLineException

当然,您需要将Microsoft.VisualBasic添加到项目引用中。

答案 3 :(得分:0)

这是另一个,Cinchoo ETL - 一个开源文件助手库,用于加载CSV文件并找到如下项目

string csv = @"old,newuser,newpassword
firstlinetomakesure,firstnewusername,firstnewpassword
adslusernameplaintext,thisisthenewuser,andthisisthenewpassword
hello,terion,nadiomn
somethingdownhere,thisisthelastuser,andthisisthelastpassword 
11,12,13
21,22,23 
31,32,33";

using (var p = new ChoCSVReader(new StringReader(csv))
    .WithFirstLineHeader()
    )
{
    Console.WriteLine(p.Where(rec => rec.old == "hello").Select(rec => rec.newuser).First());
}

免责声明:我是这个图书馆的作者。