我有一个解析.txt文件的C#控制台应用程序。 txt文件的每一行都有4个值。因此,这里有一些示例:
c:\ecpg\myfolder\no_space.cfm 20160803 01:09:54 1574
c:\ecpg\myfolder\file with space.cfm 20160803 01:09:54 1574
c:\myfolder\.project 20170221 07:54:10 265
我正在使用以下内容基于每行中的空白进行拆分:
while ((line = file.ReadLine()) != null)
{
string[] parts = line.Split(new char[0], StringSplitOptions.RemoveEmptyEntries);
}
问题是,在第2行的情况下,文件名中有一个空格,因此解析失败,因为现在我有5个值而不是4个值。如何防止这种情况发生?也许有某种方法可以检测是否存在。 (点)空格之后不久?
谢谢!
最佳答案
您可以使用Regex来split
您的string
,它将为您提供更好的输出。请检查我的代码:
while ((line = file.ReadLine()) != null)
{
string[] parts = Regex.Split(line, @"(\s+\s+)");
}
另外我已经在DotNetFiddle中写过了,您可以检查一下。
编辑:我已经编辑了代码,它将涵盖您的所有情况。 New Solution Fiddle
while ((line = file.ReadLine()) != null)
{
string partOne = Regex.Match(line, @"[a-z](.*)[a-z]").Value;
//string[] parts = Regex.Split(line.Replace(partOne, ""), @"(\s+)");
string[] parts;
if (!string.IsNullOrEmpty(partOne))
{
parts = Regex.Split(line.Replace(partOne, ""), @"(\s+)");
}
else
{
parts = Regex.Split(line, @"(\s+)");
}
}
最终代码:
List<string> parts = new List<string>();
while ((line = file.ReadLine()) != null)
{
parts = new List<string>();
//string partOne = Regex.Match(line, @"[A-Za-z](.*)[A-Za-z]").Value;
//Update Regex for handle numeric value in part one.
string partOne = Regex.Match(line, @"[A-Za-z](.*)([A-Za-z]|([A-Za-z]{1}[0-9]))(.*?)\s").Value.Trim();
parts.Add(partOne);
string[] fianlParts;
if (!string.IsNullOrEmpty(partOne))
{
fianlParts = Regex.Split(line.Replace(partOne, ""), @"(\s+)");
}
else
{
fianlParts = Regex.Split(line, @"(\s+)");
}
foreach (string part in fianlParts)
{
if (!string.IsNullOrEmpty(part.Trim()))
{
parts.Add(part);
}
}
Console.WriteLine(parts[0] + " " + parts[1] + " " + parts[2] + " " + parts[3]);
}
关于c# - C#控制台应用程序:捕获空白的某些情况,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42727203/