【问题标题】:Replace specific data in a csv file替换 csv 文件中的特定数据
【发布时间】:2016-08-21 22:46:30
【问题描述】:

我正在尝试替换 csv 文件中的特定数据字段,但遇到了问题。

我的 csv 文件结构如下:

user, password, role, id,
1, abc, 2, 3
2, def, 2, 4
3, ghi, 5, 5

我可以很好地读取文件,但是当我想使用 Windows 窗体中的文本框和按钮替换密码时,我遇到了问题。

private void resetBtn_Click(object sender, EventArgs e)
    {
        var encoding = Encoding.GetEncoding("iso-8859-1");
        var csvLines = File.ReadAllLines("C:\\Users\\hughesa3\\Desktop\\test environment\\users.csv", encoding);

        foreach (var line in csvLines)
        {
            var values = line.Split(',');
            if (values[0].Contains(form2value))
            {
                values[1] = confirmPass.Text;
            }
    }
}

Form2value 是他们的用户名,所以我尝试做的是:如果第一列包含在 form2value 中输入的内容,它将转到该行的第二列。

我试过了

 var values = line.Split(',');
            if (values[0].Contains(form2value))
            {
                MessageBox.Show(values[1]);
                values[1] = confirmPass.Text;
                MessageBox.Show(values[1]);
            }
    }

只是为了看看值是否在变化,但它也显示每个值[1],而我只希望它在找到 form2value 时显示。

我已尽力解释这一点,但如果有人需要更多信息,请告诉我。

有人知道我做错了什么吗?

【问题讨论】:

  • 您是否尝试在开始时添加 MessageBox.Show(form2value) 以查看该变量中的内容?如果它为空或包含空格,您将看到所有行。

标签: c# csv


【解决方案1】:

如果您使用数据表,您的生活会更轻松............

这是一个摘录... DT 是一个数据表。 拆分文件的第一行和我们 dt.Columns.Add 以添加列标题....

private void AddDataToDataTable()
{
    using (StreamReader sr = new StreamReader(new MemoryStream(this.FileContents)))
    {
        //Igone headings & blank Lines
        string line = string.Empty;
        while ((line = sr.ReadLine()) != null)
        {
            //If blank line then skip line
            if (line == string.Empty) 
            {
                continue;
            }
            dt.Rows.Add(line.Split(this.Delimeter));
        }
    }
}

希望对你有帮助

【讨论】:

    【解决方案2】:

    您正在更改您在代码中使用的values 内部数组,而不是文件本身。事实上,您并没有在任何地方写入文件,只是在读取它。

    您需要:读取文件,获取用户名所在的行(如果存在),然后在该特定行中写入密码。

    你可以这样做:

    private void resetBtn_Click(object sender, EventArgs e)
    {
        var encoding = Encoding.GetEncoding("iso-8859-1");
        var csvLines = File.ReadAllLines("C:\\Users\\hughesa3\\Desktop\\test environment\\users.csv", encoding);
    
        for (int i = 0; i < csvLines.Length; i++)
        {
            var values = csvLines[i].Split(',');
            if (values[0].Contains(form2value))
            {
                values[1] = confirmPass.Text;
    
                using (FileStream stream = new FileStream("C:\\Users\\hughesa3\\Desktop\\test environment\\users.csv", FileMode.Create))
                {
                    using (StreamWriter writer = new StreamWriter(stream, encoding))
                    {
                        for (int currentLine = 0; currentLine < csvLines.Length; ++currentLine)
                        {
                            if (currentLine == i)
                            {
                                writer.WriteLine(string.Join(",", values));
                            }
                            else
                            {
                                writer.WriteLine(csvLines[i]);
                            }
                        }
    
                        writer.Close();
                    }
    
                    stream.Close();
                }
            }
        }
    }
    

    【讨论】:

    • 上一段代码有错误。这:否则 { writer.WriteLine(csvLines[i]); } 到这个:否则 { writer.WriteLine(csvLines[currentLine]); }
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多