开发者

Code to trim part of a text file in C#

开发者 https://www.devze.com 2023-03-12 02:24 出处:网络
I have a situation where I am given a text file with text formatted as follows: C:\\Users\\Admin\\Documents\\report2011.do开发者_JAVA百科cx: My Report 2011

I have a situation where I am given a text file with text formatted as follows:

C:\Users\Admin\Documents\report2011.do开发者_JAVA百科cx: My Report 2011
C:\Users\Admin\Documents\newposter.docx: Dinner Party Poster 08

How would it be possible to trim the text file, so to trim the ":" and all characters after it.

E.g. so the output would be like:

C:\Users\Admin\Documents\report2011.docx
C:\Users\Admin\Documents\newposter.docx




Current Code:

        private void button1_Click(object sender, EventArgs e)
        {

            using (StreamWriter sw = File.AppendText(@"c:\output.txt"))
            {
                StreamReader sr = new StreamReader(@"c:\filename.txt");
                Regex reg = new Regex(@"\w\:(.(?!\:))+");
                List<string> parsedStrings = new List<string>();

                while (sr.EndOfStream)
                {
                    sw.WriteLine(reg.Match(sr.ReadLine()).Value);
                }
            }

        }

Not working :(


int index = myString.LastIndexOf(":");
if (index > 0)
   myString= myString.Substring(0, index);

Edit - Added answer based on modified question. It can be condensed slightly, but left expanded for clarity of what's going on.

 using (StreamWriter sw = File.AppendText(@"c:\output.txt"))
 {
      using(StreamReader sr = new StreamReader(@"input.txt"))
      {                    

          string myString = "";
          while (!sr.EndOfStream)
          {

                myString = sr.ReadLine();
                int index = myString.LastIndexOf(":");
                if (index > 0)
                    myString = myString.Substring(0, index);

                sw.WriteLine(myString);
           }
       }
  }


Edited

StreamReader sr = new StreamReader("yourfile.txt");
Regex reg = new Regex(@"\w\:(.(?!\:))+");
List<string> parsedStrings = new List<string>();
while (!sr.EndOfStream) 
{
    parsedStrings.Add(reg.Match(sr.ReadLine()).Value);
}


sure. while reading each line, do a

Console.WriteLine(line.Substring(0,line.IndexOf(": "));


i'd use the answer given here Code to trim part of a text file in C# and find the 2nd occurrence and then use it in substring.

var s = @"C:\Users\Admin\Documents\report2011.docx: My Report 2011";
var i = GetNthIndex(s,':',2);
var result = s.Substring(i+1);


public int GetNthIndex(string s, char t, int n)
{
    int count = 0;
    for (int i = 0; i < s.Length; i++)
    {
        if (s[i] == t)
        {
            count++;
            if (count == n)
            {
                return i;
            }
        }
    }
    return -1;
}


Assuming this is being done where the files are supposed to exist, you could handle this taking into account any colons in the (what I assume is) description by checking for the existence of the files after you get the index of the colon.

        List<string> files = new List<string>();
        files.Add(@"C:\Users\Admin\Documents\report2011.docx: My Report 2011");
        files.Add(@"C:\Users\Admin\Documents\newposter.docx: Dinner Party Poster 08");
        files.Add(@"C:\Users\Admin\Documents\newposter.docx: Dinner Party: 08");

        int lastColon;
        string filename;
        foreach (string s in files)
        {
            bool isFilePath = false;
            filename = s;
            while (!isFilePath)
            {
                lastColon = filename.LastIndexOf(":");
                if (lastColon > 0)
                {
                    filename = filename.Substring(0, lastColon);
                    if (File.Exists(filename))
                    {
                        Console.WriteLine(filename);
                        isFilePath = true;
                    }
                }
                else
                {
                    throw new FileNotFoundException("File not found", s);
                }
            }
        }


Try this: more faster:

 string s = @"C:\Users\Admin\Documents\report2011.docx: My Report 2011";
            string path = Path.GetDirectoryName(s) + s.Split(new char[] { ':' }) [1];
            Console.WriteLine(path); //C:\Users\Admin\Documents\report2011.docx

you need import System.IO


you could use split:

string[] splitted= myString.Split(':');

Then you get an array where you take the first one.

var mySplittedString = splitted[0]

Have a look here if you need more information on this.

EDIT: In your case you get an array with the size of at least 3 so you need to get splitted[0] and splitted[ 1]

0

精彩评论

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