Matt
Matt

Reputation: 21

Searching strings in txt file

I have a .txt file with a list of 174 different strings. Each string has an unique identifier. For example:

123|this data is variable|
456|this data is variable|
789|so is this|
etc..

I wish to write a programe in C# that will read the .txt file and display only one of the 174 strings if I specify the ID of the string I want. This is because in the file I have all the data is variable so only the ID can be used to pull the string. So instead of ending up with the example about I get just one line.

eg just

123|this data is variable| 

I seem to be able to write a programe that will pull just the ID from the .txt file and not the entire string or a program that mearly reads the whole file and displays it. But am yet to wirte on that does exactly what I need. HELP!

Well the actual string i get out from the txt file has no '|' they were just in the example. An example of the real string would be: 0111111(0010101) where the data in the brackets is variable. The brackets dont exsist in the real string either.

namespace String_reader { class Program { static void Main(string[] args) { String filepath = @"C:\my file name here"; string line;

        if(File.Exists(filepath))

        {
            StreamReader file = null;
            try
            {
                file = new StreamReader(filepath);
                while ((line = file.ReadLine()) !=null)
                {
                    string regMatch = "ID number here"; //this is where it all falls apart.
                    Regex.IsMatch (line, regMatch);

                    Console.WriteLine (line);// When program is run it just displays the whole .txt file
                }
            }
        }
        finally{
            if (file !=null)
                file.Close();
        }
    }
    Console.ReadLine();


    }
}

}

Upvotes: 2

Views: 3141

Answers (9)

fdermishin
fdermishin

Reputation: 3686

You can use Split method to divide the entire text into parts sepparated by '|'. Then all even elements will correspond to numbers odd elements - to strings.

StreamReader sr = new StreamReader(filename);
string text = sr.ReadToEnd();
string[] data = text.Split('|');

Then convert certain data elements to numbers and strings, i.e. int[] IDs and string[] Strs. Find the index of the given ID with idx = Array.FindIndex(IDs, ID.Equals) and the corresponding string will be Strs[idx]

List <int> IDs;
List <string> Strs;
for (int i = 0; i < data.Length - 1; i += 2)
{
    IDs.Add(int.Parse(data[i]));
    Strs.Add(data[i + 1]);
}
idx = Array.FindIndex(IDs, ID.Equals); // we get ID from input
answer = Strs[idx];

Upvotes: 0

Flynn1179
Flynn1179

Reputation: 12075

Use a Regex. Something along the lines of Regex.Match("|"+inputString+"|",@"\|[ ]*\d+\|(.+?)\|").Groups[1].Value

Oh, I almost forgot; you'll need to substitute the d+ for the actual index you want. Right now, that'll just get you the first one.

The "|" before and after the input string makes sure both the index and the value are enclosed in a | for all elements, including the first and last. There's ways of doing a Regex without it, but IMHO they just make your regex more complicated, and less readable.

Upvotes: 3

sehe
sehe

Reputation: 392979

    private static IEnumerable<string> ReadLines(string fspec)
    {
        using (var reader = new StreamReader(new FileStream(fspec, FileMode.Open, FileAccess.Read, FileShare.Read)))
        {
            while (!reader.EndOfStream)
                yield return reader.ReadLine();
        }
    }

    var dict = ReadLines("input.txt")
        .Select(s =>
                    {
                        var split = s.Split("|".ToArray(), 2);
                        return new {Id = Int32.Parse(split[0]), Text = split[1]};
                    })
        .ToDictionary(kv => kv.Id, kv => kv.Text);

Please note that with .NET 4.0 you don't need the ReadLines function, because there is ReadLines

You can now work with that as any dictionary:

 Console.WriteLine(dict[12]);
 Console.WriteLine(dict[999]);

No error handling here, please add your own

Upvotes: 1

Gabriel
Gabriel

Reputation: 1443

first load the hole file to a string.
then try this:

string s = "123|this data is variable| 456|this data is also variable| 789|so is this|";
int index = s.IndexOf("123", 0);
string temp = s.Substring(index,s.Length-index);
string[] splitStr = temp.Split('|');
Console.WriteLine(splitStr[1]);

hope this is what you are looking for.

Upvotes: 1

Carra
Carra

Reputation: 17964

  • Read the data into a string
  • Split the string on "|"
  • Read the items 2 by 2: key:value,key:value,...
  • Add them to a dictionary

Now you can easily find your string with dictionary[key].

Upvotes: 1

František Žiačik
František Žiačik

Reputation: 7614

Assuming you have path and id.

Console.WriteLine(File.ReadAllLines(path).Where(l => l.StartsWith(id + "|")).FirstOrDefault());

Upvotes: 2

mrK
mrK

Reputation: 2278

FileInfo info = new FileInfo("filename.txt");
String[] lines = info.OpenText().ReadToEnd().Split(' ');

foreach(String line in lines)
{
    int id = Convert.ToInt32(line.Split('|')[0]);
    string text = Convert.ToInt32(line.Split('|')[1]);
}

Upvotes: 1

archil
archil

Reputation: 39501

You could use Regex.Split method

Upvotes: 1

Michael Blake
Michael Blake

Reputation: 2168

Use ReadLines to get a string array of lines then string split on the |

Upvotes: 1

Related Questions