使用StreamReader生成ID(最后一行)

时间:2012-12-10 00:19:56

标签: c# .net winforms linq stream

我正在尝试使用我的.CSV文件上的StreamReader生成项ID(它必须是.csv文件)。物品ID应从1000开始并上升(1001,1002等)

现在,如果用户按下“生成ID”,它将在整个文件中搜索值“1000”,如果它不存在,它将在文本框中写入“1000”。

以下是我需要帮助的内容:如果文件包含“1000”,我希望它读取最后一行,将其增加1,然后在文本框中写入值。所以,如果.csv文件中的最后一个值是1005,我希望它在文本框中写入1006。

    private void GenerateID_Click(object sender, EventArgs e)
    {
        try
        {
            string searchString = "1000";
            using (StreamReader sr = new StreamReader("file.csv"))
            {
                string line;
                while ((line = sr.ReadLine()) != null)
                {
                    if (line.Contains(searchString))
                    {
                        /* If file contains 1000, read the LAST line
                         * (Whatever number that may be: 1001, 1002, 1003, etc.)
                         * and increase that number by 1, then write to textbox. */
                    }
                    else
                    {
                        invItemIDField.Text = Convert.ToString("1000");
                    }
                }
            }
        }
        catch (Exception)
        {
            MessageBox.Show("The file could not be read");
        }
    }

2 个答案:

答案 0 :(得分:3)

我建议你使用FileHelpers。它是最适合读取CSV文件的库。

要安装此功能,您需要先安装NuGet。安装完成后,转到工具>库包管理器>软件包管理器控制台:

NuGet Package Manager

然后,输入:Install-Package Filehelpers

你很高兴去!

FileHelpers导入您的代码

using FileHelpers;

创建一个描述CSV结构的类:

DelimitedRecord("'")]
public class MyCsv
{
    public int Column1; // Your ID column
    public string SomeOtherColumn; 
}

创建List<MyCsv>

List<MyCsv> myList;

然后,加载您的CSV:

FileHelperEngine<MyCsv> engine = new FileHelperEngine<MyCsv>();
myList = new List<MyCsv>(engine.ReadFile("my.csv")); // replace with your filename or variable containing the filename

您现在可以通过访问列表myList

来阅读您的CSV
foreach(MyCsv line in myList) {
    // Do something;
}

该列表中的每个对象都对应于CSV中的每一行。为了访问行的第一列(给定上面的foreach循环):

line.Column1

因此,如果您需要比较值,您可以使用LINQ或进行传统的循环搜索:

foreach(MyCsv line in myList) {
    if (txtId.Text == line.Column1.ToString()) {
        found = true;
        break;
    }
}

然后,获取最后一行的id:

myList.[myList.Count - 1].Column1

你可以做其余的事。干杯!

答案 1 :(得分:2)

这是我的目标,它与你的不同,但它有效。当然,您必须考虑的事项,例如引号中包含的元素,换行符\ r \ n等等:

    int TextBoxValue = 1000;
    var reader = new StreamReader(File.OpenRead(@"C:\Users\J\Desktop\New Text Document (4).txt"));
    var contents = reader.ReadToEnd().Split(new string[] {"\r\n"}, StringSplitOptions.None);

    var iValueExists = (from String sLine in contents
                        where sLine.Contains("1000")
                        select sLine).Count();
    if (iValueExists > 0)
    {
        TextBoxValue = int.Parse(contents.Last().Split(new string[] {","}, StringSplitOptions.None).First()) + 1;
    }

    invItemIDField.Text = TextBoxValue;
    reader.Close();

enter image description here