我有一个从目录列表中创建的文件。从用户从ListBox中选择的每个项目,应用程序读取目录并写出匹配所有内容的文件。完成后,它会遍历ListBox中的每个项目,并复制出与ListBox选择匹配的项目。例如:
选择0001匹配:
我正在使用的代码不是很好地处理0并且给出了错误的结果。
var listItems = listBox1.Items.OfType<string>().ToArray();
var writers = new StreamWriter[listItems.Length];
for (int i = 0; i < listItems.Length; i++)
{
writers[i] = File.CreateText(
Path.Combine(destinationfolder, listItems[i] + "ANN.TXT"));
}
var reader = new StreamReader(File.OpenRead(masterdin + "\\" + "MasterANN.txt"));
string line;
while ((line = reader.ReadLine()) != null)
{
for (int i = 0; i < listItems.Length; i++)
{
if (line.StartsWith(listItems[i].Substring(0, listItems[i].Length - 1)))
writers[i].WriteLine(line);
}
}
建议纠正这个问题?
另一个样本:
我的列表框中有00001:它返回这些值:
00008771〜63.txt
00002005〜3.txt
00009992〜1.TXT
00001697〜1.TXT
00000001〜1.TXT
00009306〜2.txt
00000577〜1.TXT
00001641〜1.TXT
00001647〜1.TXT
00001675〜1.TXT
00001670~1.txt
它应该只返回:
00001641〜1.TXT
00001647〜1.TXT
00001675〜1.TXT
00001670〜1.TXT
00001697~1.txt
或者,如果有人可以建议一个更好的方法来获取我的列表框中的每一行搜索行+“*”和任何匹配写出文本文件......
答案 0 :(得分:0)
很抱歉,如果我误解了你的问题,那么让我们从这开头:
string line = String.Empty;
string selectedValue = "00001";
List<string> matched = new List<string>();
StreamReader reader = new StreamReader(Path.Combine(masterdin, "MasterANN.txt"));
while((line = reader.ReadLine()) != null)
{
if(line.StartsWith(selectedValue))
{
matched.Add(line);
}
}
这将匹配MasterANN.txt
文件中以"00001"
开头的所有行,并将它们添加到集合中(如果需要,我们稍后会将其写入文件中)。
这澄清了什么?
答案 1 :(得分:0)
这完全基于你给出的一个例子,但我相信问题在于,当你执行匹配时,如果你的列表项值和截断最后一个字符,你将得到子字符串。
在您的示例中,您尝试匹配以“00001”开头的文件,但是当您执行匹配时,您将获得从零开始的子字符串和value.length-1个字符,在本例中为“0000”。例如:
string s = "00001";
Console.WriteLine(s.Substring(0,s.Length-1));
结果
0000
所以我想如果你改变了这一行:
if (line.StartsWith(listItems[i].Substring(0, listItems[i].Length - 1)))
writers[i].WriteLine(line);
到这个
if (line.StartsWith(listItems[i]))
writers[i].WriteLine(line);
你的身体状况良好。