开发者

C# writing out text files matching listbox and contents of another text file

I have a file created from a directory listing. From each of item a user selects from a ListBox, the application reads the directory and writes out a file that matches all the contents. Once that is done it goes through each item in the ListBox and copies out the item that matches the ListBox selection. Example:

Selecting 0001 matches:

  • 0001456.txt
  • 0001548.pdf.

The code i am using isn't handling 0s very well and is giving bad results.

var listItems = listBox1.Items.OfType<string>().To开发者_运维技巧Array();
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);
    }
}

Advice for correcting this?

Another Sample: I have 00001 in my listbox: it returns these values:

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

It should only return:

00001641~1.txt

00001647~1.txt

00001675~1.txt

00001670~1.txt 00001697~1.txt

Or if someone could just suggest a better method for taking each line in my listbox searching for line + "*" and whatever matches writes out a textfile...


This is all based pretty much on the one example you gave, but I believe the problem is that when you are performing your matching, you are getting the substring if your list item value and chopping off the last character.

In your sample you are attempting to match files starting with "00001", but when you do the match you are getting substring starting at zero and value.length-1 characters, which in this case would be "0000". For example:

string s = "00001";
Console.WriteLine(s.Substring(0,s.Length-1));

results in

0000

So I think if you just changed this line:

if (line.StartsWith(listItems[i].Substring(0, listItems[i].Length - 1))) 
            writers[i].WriteLine(line);

to this

if (line.StartsWith(listItems[i]))
            writers[i].WriteLine(line);

you would be in good shape.


Sorry if I misunderstood your question, but let's start with this:

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);
    }
}

This will match all lines from your MasterANN.txt file which begins with "00001" and add them into a collection (later we'll work on writing this into a file, if required).

This clarifies something?

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜