需要帮助阅读C#中的文件中的子串?

时间:2017-06-28 10:31:48

标签: c# file substring

所以我创建了一个子程序来读取一些文件......这是代码:

dataGridView1.Rows.Clear();

            string[] lines = File.ReadAllLines(Application.StartupPath + listBox1.Text + ".txt");

            foreach (string line in lines)
        {

            int posicion1 = line.IndexOf("|") + 1;
            int posicion2 = line.IndexOf("|", posicion1) + 1;
            int posicion3 = line.IndexOf("|", posicion2) + 1;
            int posicion4 = line.IndexOf("|", posicion3) + 1;


            data1 = line.Substring(0, posicion1 - 1);
            data2 = line.Substring(posicion1, posicion2 - posicion1 - 1);
            formacao = line.Substring(posicion2, posicion3 - posicion2 - 1);
            relatorio = line.Substring(posicion3, posicion4 - posicion3 -1);

            dataGridView1.Rows.Add(data1, data2, formacao, relatorio);


        }

然而,当谈到将变量“relatorio”添加到dataGridView时,它只是添加了我保存变量的ENTIRE行......这就是我如何从文件中保存一行,例如:

2017 de junho de 2017 | 28 de junho de 2017 | fsdfsdfsd |Não

如您所见,我将所有变量与“|”分开。 总结一下,该程序正常工作,除了变量“relatorio”,只是添加了整个行(28 de junho de 2017 | 28 de junho de 2017 | fsdfsdfsd |Não),只是应该添加“Não”。

有人可以帮帮我吗?对不起,如果问题不够明确。

- 更新

所以我试着改用它:

 foreach (string line in lines)
        {

            string[] _line = line.Split('|');
            string value1 = _line[0];
            string value2 = _line[1];
            string value3 = _line[2];
            string value4 = _line[3];
            dataGridView1.Rows.Add(value1, value2, value3, value4);


        }

但是我的程序仍然存在同样的错误...... 我开始认为我没有正确保存我的文件,但我真的没有看到我搞砸了...当我关闭程序时文件仍然是相同的类型:

2017 de junho de 2017 | 28 de junho de 2017 | fwfew |Não

如果你有时间的话,有人可以测试一下吗?

2 个答案:

答案 0 :(得分:2)

String类已经有Split方法:

var parts=line.Split('|');
dgv1.Rows.Add(parets[0], parts[1], parts[2], parts[3]);

各种Split重载允许您使用多个分隔符并消除空结果

您应该查看CsvHelper之类的解析器。它可以直接解析CSV数据并将其映射到对象,允许自定义映射和转换,例如:

public class MyClass { public string Data1{get;set;} ...}

using(var reader=File.OpenText(csvPath))
{
    var csv = new CsvReader( textReader );
    csv.Configuration.Delimiter = "|";
    var records = csv.GetRecords<MyClass>().ToList();
    dgv1.DataSource=records;
}

或者使用LINQ:

    var records = csv.GetRecords<MyClass>().Where(it=>it.Data1 >=...).ToList();

答案 1 :(得分:0)

使用IndexOf,你使事情变得比它们应该更复杂。您只需使用javadoc方法获取值:

foreach (string line in lines)
{
     string[] _line = line.Split('|');
     string value1 = _line[0];
     string value2 = _line[1];
     ...

     dataGridView1.Rows.Add(value1 , value2 , ...);
}