Как получить строки до и после указанного текста, а затем печатать в текст в C #? - PullRequest
0 голосов
/ 16 мая 2018

У меня действительно большой txt файл (назовите его input.txt). Большая часть информации мне не нужна, но есть много iD-ов, которые находятся между строками id= и amp. Я хочу записать каждый идентификатор в новый файл txt (output.txt), где каждый идентификатор находится в новой строке.

Как мне это сделать?

https://pastebin.com/5tqAiPUi - образец txt

Желаемый вывод:

1839708603
1845432669
1850285729
100000000530931
100000011404225

Ответы [ 3 ]

0 голосов
/ 16 мая 2018

Я думаю, этот код поможет вам извлечь:

        const string startString = "id=";
        const string endString = "amp";

        string test = "ffvreergverfverid=38338ampvevbevvid=3amp";
        StringBuilder outfile = new StringBuilder();
        do
        {
            int startPos = test.IndexOf(startString);
            int endPos = test.IndexOf(endString);
            outfile.AppendLine(test.Substring(startPos, endPos - startPos));
            test = test.Remove(startPos, (endPos + endString.Length)- startPos);
        }while(test.Contains(startString));
0 голосов
/ 16 мая 2018

Похоже, что вы читаете URL

. Я бы лично проверил StreamReader класс, вам нужно будет прочитать каждый символ, пока не найдете последовательность символов, так что-то вроде:

    using System;
    using System.Collections.Generic;
    using System.IO;
    using System.Linq;
    using System.Text;
    namespace StrReader
    {
        class Program
        {
            static void Main(string[] args)
            {
                bool hit = false;
                string start = "?id=";
                string end = "&";
                string buffer = string.Empty;
                string endBuffer = string.Empty;
                using(StreamReader sr = new StreamReader(@"C:\development\zaza.txt"))
                {
                    while (sr.Peek() >= 0)
                    {
                        string value = ((char)sr.Read()).ToString();
                        if(!hit){
                            if (start.IndexOf(value) > -1)
                                buffer = string.Concat(buffer, value);
                            else buffer = string.Empty;
                            hit = string.Equals(buffer, start, StringComparison.CurrentCultureIgnoreCase);
                            if (buffer.Length >= start.Length && hit)
                                buffer = string.Empty;
                        }
                        else
                        {
                            if (end.IndexOf(value) > -1)
                                endBuffer = String.Concat(endBuffer, value);
                            else
                                endBuffer = string.Empty;
                            buffer = string.Concat(buffer, value);
                            if (endBuffer == end)
                            {
                                Console.WriteLine(buffer.Substring(0,buffer.Length - endBuffer.Length ));
                                buffer = string.Empty;
                                hit = false;
                            }
                            buffer = string.Concat(buffer, value);
                        }
                    }
                }
                Console.ReadLine();
            }
        }
    }

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

Простонекоторые комментарии к приведенному выше коду заменяют c: \ development \ zaza.txt на большой файл, также вам нужно будет изменить начальный идентификатор? id = на то, что вам нужно.Наконец, конечный идентификатор (&) необходимо изменить в соответствии с вашими требованиями.

0 голосов
/ 16 мая 2018

Вы можете попробовать регулярные выражения :

  using System.Text.RegularExpressions;
  using System.Linq;

  ...

  string text = ...;

  string[] ids = Regex
    .Matches(text, "(?:id=)(?<value>[0-9]+)(?:&amp)")
    .OfType<Match>()
    .Select(match => match.Groups["value"].Value)
    .ToArray();

Если вы хотите читать / записывать данные из / в файл (ы):

 File.WriteAllLines(@"c:\Output.txt", Regex
    .Matches(File.ReadAllText(@"c:\Input.txt"), "(?:id=)(?<value>[0-9]+)(?:&amp)")
    .OfType<Match>()
    .Select(match => match.Groups["value"].Value)); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...