1

我正在尝试在我的 .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");
        }
    }
4

2 回答 2

3

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

要安装它,您需要先安装NuGet。安装后,转到工具 > 库包管理器 > 包管理器控制台:

NuGet 包管理器

然后,输入: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

您现在可以通过访问列表来读取您的 CSV myList

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

你可以做剩下的事情。干杯!

于 2012-12-10T00:43:45.447 回答
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();

在此处输入图像描述

于 2012-12-10T00:43:02.960 回答