.NET String.Split问题

时间:2014-01-26 20:53:53

标签: c# text datagridview

我正在尝试解析包含正在远程FTP服务器上使用的数据的文本文件。数据由等号(=)分隔,我试图将每一行加载到DataGridView中的两列。我编写的代码工作正常,除非将等号字符抛入第二列的值。发生这种情况时,无论指定最大计数为2.如果可能,我宁愿不更改分隔符。

以下是有问题的代码:

        dataGrid_FileContents.Rows.Clear();

        char delimiter = '=';

        StreamReader fileReader = new StreamReader(fileLocation);

        String fileData = fileReader.ReadToEnd();
        String[] rows = fileData.Split("\n".ToCharArray());

        for(int i = 0; i < rows.Length; i++)
        {
            String str = rows[i];

            String[] items = str.Split(new char[] { delimiter }, 1, StringSplitOptions.RemoveEmptyEntries);

            if (items.Length == 2)
            {
                dataGrid_FileContents.Rows.Add(items[0], items[1]);
            }
        }

        fileReader.Close();

正在加载文件的示例:

boats=123
cats=234-f
cars==1

它按预期用于前两行,然后忽略最后一行,因为它最终创建一个带有1个元素的String []和两个带有零元素的String []。

3 个答案:

答案 0 :(得分:0)

一个不同的解决方案,如果您希望在第一个等于之后的所有内容,那么您可以使用string.IndexOf来解决此问题

for(int i = 0; i < rows.Length; i++)
{
    String str = rows[i];
    int pos = str.IndexOf(delimiter);
    if (pos != -1)
    {
        string first = str.Substring(0, pos-1);
        string second = str.Substring(pos + 1);
        dataGrid_FileContents.Rows.Add(first, second);
    }
}

答案 1 :(得分:0)

尝试以下方法。它将捕获第一个'='之前和之后的值,正确解析cars==1场景。

String[] items = str.Split(new char[] { delimiter }, 2, stringSplitOptions.None);

答案 2 :(得分:0)

只需阅读行中'='分隔的所有项目。 然后迭代项目,检查该项目是否为空,而不是使用此准备好的数据写入

这里举例说明了片段 http://dotnetfiddle.net/msVho2

并且您的代码段可以转换为类似下面的内容

dataGrid_FileContents.Rows.Clear();

char delimiter = '=';

using(StreamReader fileReader = new StreamReader(fileLocation))
{
    string[] data = new string[2];

    while(true)
    {
        string row = fileReader.ReadLine();
        if(row == null)
            break;

        string[] items = row.Split(delimiter);
        int data_index = 0;
        foreach(string item in items)
        {
            if(data_index >= data.Length)
            {
                //TODO: log warning
                break;
            }

            if(!string.IsNullOrWhiteSpace(item))
            {
                data[data_index++] = item;
            }

        }

        if(data_index < data.Length)
        {
            //TODO: log error, only 1 item in row
            continue;
        }


        dataGrid_FileContents.Rows.Add(data[0], data[1]);

    }
}