我们正在尝试从文本文件中读取每个单词,并将其替换为另一个单词。对于较小的文本文件,它运行良好。但对于较大的文本文件,我们总是得到一个例外:"字符串不能为零长度。参数名称:oldValue"
void replace()
{
string s1 = " ", s2 = " ";
StreamReader streamReader;
streamReader = File.OpenText("C:\sample.txt");
StreamWriter streamWriter = File.CreateText("C:\sample1.txt");
//int x = st.Rows.Count;
while ((line = streamReader.ReadLine()) != null)
{
char[] delimiterChars = { ' ', 't' };
String[] words = line.Split(delimiterChars);
foreach (string str in words)
{
s1 = str;
DataRow drow = st.Rows.Find(str);
if (drow != null)
{
index = st.Rows.IndexOf(drow);
s2 = Convert.ToString(st.Rows[index]["Binary"]);
s2 += "000";
// Console.WriteLine(s1);
// Console.WriteLine(s2);
streamWriter.Write(s1.Replace(s1,s2)); // Exception occurs here
}
else
break;
}
}
streamReader.Close();
streamWriter.Close();
}
我们找不到原因。提前谢谢。
执行string.Split
时,如果有多个空格或制表符,则可能会得到空条目。这些字符串的长度为0,因此无法替换。
使用重载,该重载使用StringSplitOptions
参数剥离空结果:
var words = line.Split(delimiterChars, StringSplitOptions.RemoveEmptyEntries);
发生异常是因为s1
在某个时刻是空字符串。您可以通过更换线路来避免这种情况
String[] words = line.Split(delimiterChars);
这个:
String[] words = line.Split(delimiterChars, StringSplitOptions.RemoveEmptyEntries);
您想更改您的Split方法调用,如下所示:
String[] words = line.Split(delimiterChars,StringSplitOptions.RemoveEmptyEntries);
这意味着s1包含一个空字符串("),如果您的文件中有两个连续的空白或制表符,就会发生这种情况。