Код для обрезки части текстового файла в C # - PullRequest
2 голосов
/ 08 июня 2011

У меня есть ситуация, когда мне дают текстовый файл с текстом, отформатированным следующим образом:

C:\Users\Admin\Documents\report2011.docx: My Report 2011
C:\Users\Admin\Documents\newposter.docx: Dinner Party Poster 08

Как можно обрезать текстовый файл, чтобы обрезать ":" и все символы после него.

например. поэтому вывод будет выглядеть так:

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

        }

Не работает: (

Ответы [ 7 ]

1 голос
/ 08 июня 2011

Отредактировано

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);
}
1 голос
/ 08 июня 2011
int index = myString.LastIndexOf(":");
if (index > 0)
   myString= myString.Substring(0, index);

Редактировать - добавлен ответ на основе измененного вопроса. Это может быть немного сжато, но оставлено расширенным для ясности происходящего.

 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);
           }
       }
  }
0 голосов
/ 08 июня 2011

Попробуйте это: быстрее:

 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

нужен импорт System.IO

0 голосов
/ 08 июня 2011

Предполагая, что это делается там, где файлы должны существовать, вы можете справиться с этим, принимая во внимание любые двоеточия в (что я предполагаю, что) описании, проверяя наличие файлов после получения индекса двоеточия..

        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);
                }
            }
        }
0 голосов
/ 08 июня 2011

Я бы использовал ответ, приведенный здесь Код, чтобы обрезать часть текстового файла в C # и найти второе вхождение, а затем использовать его в подстроке.

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;
}
0 голосов
/ 08 июня 2011

вы можете использовать сплит:

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

Тогда вы получите массив, где вы берете первый.

var mySplittedString = splitted[0]

Посмотрите здесь , если вам нужна дополнительная информация по этому вопросу.

РЕДАКТИРОВАТЬ: В вашем случае вы получите массив размером не менее 3, поэтому вам нужно разделить [0] и разделить [1]

0 голосов
/ 08 июня 2011

уверен.читая каждую строку, выполните

Console.WriteLine(line.Substring(0,line.IndexOf(": "));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...