C#检测字符串数组中的空字符

4

我正在使用StreamReader从文本文件读取内容,将其存储到字符串数组text[]中。文本文件中的一行在数组的第1 -> 20个位置被读取为"\0"。如何检测这个空字符并忽略这一行。

代码示例:

StreamReader sr = new StreamReader(Convert.ToString(openFileDialog1.FileName));
while (!sr.EndOfStream)
{
    string l= sr.ReadLine();
    string[] parsedLine = l.Split(new char[] { '=' },StringSplitOptions.RemoveEmptyEntries);
    // Not working:
    if (parsedLine.Length == 0)
    {
        MessageBox.Show("Ignoring line");
    }

任何帮助都将是极好的!


2
你能不能这样写:if(l.contains("/0")){l.replace("/0","");} - dtsg
line 在那里做什么,你没有定义它,是指 l 吗? - yogi
抱歉,应该是 l 而不是 line,打错了。 - Daniel Flannery
@Duane。这不起作用,因为'\0'被视为空字符,而不是一系列字符“\0”。 - Daniel Flannery
@L337BEAN 是的,我不是100%确定,所以没有将其发布为答案。 - dtsg
5个回答

3
假设你指的是 ASCII 码为 0 的字符。
   if (parsedLine.Length == 0 || parsedLine[0] == '\0')continue;

编辑 如果parsedLine是一个字符串,上述方法将有效,但对于你代码中的解析:

    string[] parsedLine = l.Split(new char[] { '=' },StringSplitOptions.RemoveEmptyEntries)
                      .Where(s=>s.Length != 1 || s[0] != '\0').ToArray();

@L337BEAN 抱歉,没看清楚,以为parsedLine是一个读入的字符串,加了一个linq替代字符串数组的方法。 - Me.Name
这个程序在某种程度上是有效的。现在的问题是,每次它都会从字符串中删除所有内容。例如,如果l包含H/0e/0l/0l/0o/0,那么在您的代码行之后,它将把l传递给parsedLine作为""。我想保留hello - Daniel Flannery
2
所以这更多是一个删除所有 \0 出现的问题,而不是删除只输入了 \0 的条目?在这种情况下,您可以使用 l = l.Replace("\0", " ") 来替换为空格或者用 l = l.Replace("\0", ""); 来完全删除它们。这可行吗? - Me.Name
我想要删除空行(这是可以做到的),以及第一个字符为\0且第二个字符为=的行。这些被用作日志文件中的分隔符。例如:= = = = = = = =会被读取为=\0=\0=\0=\0=\0=\0=\0=\0 - Daniel Flannery
@L337BEAN 对于这个例子,第二个代码示例应该可以工作,但我认为之前提到的替换仍然是最简单的方法:string l = sr.ReadLine().Replace("\0",""); 对于最后一个例子,在拆分后会创建很多空元素,但它们将通过RemoveEmtpyEntries子句被删除。如果替换不是可行的解决方案,您能否发布(或上传)一个包含不同情况的更长示例文件? - Me.Name
显示剩余5条评论

1

忽略的行可以包含其他字符。 - bruno conde
@brunocondeq - 这些字符是什么?根据MSDN文档,它将忽略空字符和空字符串。 - Security Hound

1

如果该行包含空字符,请忽略该行。

string l = sr.ReadLine();
if (string.IsNullOrEmpty(l) || l[0] == '\0'))
   continue;
...

1

这里是一个 Linq 解决方案,应该可以解决问题:

StreamReader sr = new StreamReader(Convert.ToString(openFileDialog1.FileName));
while (!sr.EndOfStream)
{
    string l= sr.ReadLine();
    bool nullPresent = l.ToCharArray().Any(x => x.CompareTo('\0') == 0);

    if (nullPresent)
    {
        MessageBox.Show("Ignoring line");
    }
    else
    {
        // do other stuff
    }
}

0
string l= sr.ReadLine();
if (l == "") {
  MessageBox.Show("Ignoring line");
  continue;
}

忽略的行可以包含其他字符。 - bruno conde
这个不起作用。string does not contain a definition for 'isEmpty' 我是不是缺少一个程序集引用或者其他什么东西? - Daniel Flannery
他可能是指 string.IsNullOrEmpty("string") - dtsg
@L337BEAN 我错了,在C#中,l == "" 可以用于测试空字符串。 - xdazz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接