我正在尝试解析包含正在远程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 []。
答案 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]);
}
}