我在逐行读取文件(textasset)时遇到问题并获得结果!
这是我想要阅读的文件:
AUTHOR
COMMENT
INFO 1 X ARG 0001 0.581 2.180 1.470
INFO 2 X ARG 0001 1.400 0.974 1.724
INFO 3 X ARG 0001 2.553 0.934 0.751
INFO 4 X ARG 0001 3.650 0.494 1.053
INFO 5 X ARG 0001 1.188 3.073 1.532
INFO 6 X ARG 0001 2.312 1.415 -0.466
INFO 7 X ARG 0001 -0.232 2.249 2.180
END
以下是我正在使用的代码:
//read file
string[] line = file.text.Split("\n"[0]);
for(int i = 0 ; i < line.Length ; i++)
{
if(line[i].Contains("INFO"))
{
//To replace all spaces with single underscore "_" (it works fine)
string l = Regex.Replace(line[i]," {2,}","_");
//In this Debug.Log i get correct results
//For example "INFO_1_X_ARG_0001_0.581_2.180_1.470"
Debug.Log(l);
string[] subline = Regex.Split(l,"_");
//Only for first "INFO" line i get correct results (INFO,1,X,ARG,0001,0.581,2.180,1.470)
//For all other "INFO" lines i get incomplete results (first,fourth and fifth element are not put into substrings
//like they are dissapeard!
foreach(string s in subline){Debug.Log(s);}
}
}
说明:
我首先将文本拆分为行(工作正常),然后我只读取包含INFO
的行
我循环包含INFO
的所有行,并用下划线_
替换所有空格(这样可以正常工作)
我将包含INFO
的行拆分为基于下划线的子字符串_
当我打印出行时,只有INFO
的第一行似乎有所有子串
每个下一行都没有正确拆分(第一部分INFO
被省略,第三部分)
似乎非常不可靠。这是采用这些方法的方法吗?任何帮助表示赞赏!这应该很简单,我做错了什么?
编辑:
此代码有问题(它应该很简单,但不起作用)
这是更新的代码(我刚刚创建了一个List<string> list = new List<string>()
并复制了所有子字符串。我使用unity3D以便列表内容显示在检查器中。当我所有正确提取子字符串但简单
foreach(string s in list)
Debug.Log(s);
确实错过了一些价值观。所以我尝试了不同的东西和这段代码:
for(int x = 0; x < list.Count ; x++)
{
Debug.Log("List: " + x.ToString() + " " + list[x].ToString());
}
正确显示列表的内容,但是此代码(请注意我刚删除x.ToString()
)缺少列表中的某些元素。它不想读它们!
for(int x = 0; x < list.Count ; x++)
Debug.Log("List: " + list[x].ToString());
所以我不确定这里发生了什么?!
答案 0 :(得分:0)
尝试string.split("\t"[0]")
列之间有可能的制表符。
答案 1 :(得分:0)
存在一些问题
1&gt;您使用的包含方法区分大小写,即INFO!= info
你应该使用
line[i].ToLower().Contains("info")
2&gt;文本总是用space分隔。也可以用tab分隔。你最好用
Regex.Replace(line[i]," {2,}|\t+","_");
//this would replace 1 to many tabs or 2 or more space
答案 2 :(得分:0)
你可能想尝试这样的事情:
for (int i = 0; i < line.Length; i++)
{
if (line[i].Contains("INFO"))
{
string l = Regex.Replace(line[i], @"\p{Zs}{2,}|\t+", "_");
string[] sublines = l.Split('_');
// If you want to see the debug....
sublines.ForEach(s => Debug.Log(s));
}
}
\p{Zs}
将匹配所有Unicode分隔符/空格字符(例如空格,非中断空格等)。以下参考可能对您有所帮助:Character Classes in Regular Expressions。
答案 3 :(得分:0)
以下似乎对我有用:
using (var fs = new FileStream(filePath, FileMode.Open))
using (var reader = new StreamReader(fs))
{
string line;
while ((line = reader.ReadLine()) != null)
{
if (line.StartsWith("INFO"))
{
line = Regex.Replace(line, "[ ]+", "_");
var subline = line.Split('_');
foreach (var str in subline)
{
Console.Write("{0} ",str);
}
Console.WriteLine();
}
}
}