Member 2731148 Ответов: 2

Поиск строки в txt файле и копирование совпадающей строки в новый файл на языке C#


Привет,

Пожалуйста, помогите мне, я очень новичок в c#,

Я получаю 5 txt-файлов ежедневно с более чем 1500 записями в каждом txt-файле, мне нужно найти в каждой строке определенные строки и скопировать всю строку в новый файл.

Записи выглядят как шоу
5002290035007540002907201900000075000005378644600029100100000000000

Мне нужно найти строку 537864460 если она существует вставить всю строку в новый файл

после копирования нужно переставить строку

как показано ниже

53786446050022900350075400029072019000000750000000029100100000000000

Что я уже пробовал:

я пытался использовать файл BAT, но не смог этого сделать

BillWoodruff

Если вы добавите некоторую информацию об использовании, вы можете получить дополнительную информацию.

1. Может ли в данном файле быть более одной строки, содержащей совпадение ?

2. работаете ли вы с одним файлом за раз ?

3. будет ли матч всегда происходить в одной и той же позиции в линии ?

4. Существуют ли какие-либо другие согласованные области содержимого в одном данном файле или во всех файлах ?

Member 2731148

1: да, в каждом файле будет более одной строки, совпадающей с заданной строкой
2) Да, по одному текстовому файлу за раз
3) Да, строка будет начинаться с 40-й позиции столбца в каждой строке
4) только согласованное содержимое строк во всех файлах-это нули в конце каждой строки

BillWoodruff

Хорошая информация ! Я отвечу с некоторыми идеями сегодня (GMT + 7).

Другие вопросы: всегда ли каждая строка имеет одинаковую длину и всегда ли совпадающая строка имеет одинаковую длину.

Member 2731148

да длина строки и строки соответствия всегда постоянны

2 Ответов

Рейтинг:
2

OriginalGriff

Поскольку вы говорите о C#, давайте придерживаться решения dev и надеяться, что навыки кодирования yoiu будут соответствовать этому.
Считывание всего файла в память очень просто:

string[] lines = File.ReadAllLines(@"D:\Test Data\MyFile.txt");
Он считывает весь файл целиком, по одной строке на каждый элемент массива. Затем вы можете использовать foreach цикл для обработки каждой строки за один раз:
int start = line.IndexOf("537864460");
if (start >= 0)
   {
   // Line contains the text, start says where it starts.
   ...
   }
Затем вы можете использовать строку.Чтобы извлечь нужные части строки, переупорядочьте их в новую строку и запишите эту новую строку в файл.

Это не сложно - но это зависит от ваших знаний и уровня мастерства, и только вы можете судить об этом. :смеяться:


CPallini

5.

Maciej Los

5ed!

Рейтинг:
1

BillWoodruff

Следующий пример пытается свести к минимуму создание новых строк с помощью StringBuilder: строки в C# неизменяемы; каждая операция над строкой создает новую строку; StringBuilder изменчив: такие операции, как "вставка", "добавление", "удаление", изменение внутренних данных и возврат ссылки на сам StringBuilder.

Пример, показанный здесь, может быть "чрезмерным:" ... в том смысле, что использование StringBuilder для изготовления каждой строки может не экономить так много памяти:

public class FindMatchInFile
{
    private StringBuilder filesb; 
    private StringBuilder linesb; 

    private string line;
    private int match, lineschanged;

    public FindMatchInFile(string readfilePath, string savefilepath, string matchstring)
    {
        filesb = new StringBuilder();
        linesb = new StringBuilder();

        using (StreamReader reader = new StreamReader(readfilePath))
        {
            while (reader.Peek() >= 0)
            {
                line = reader.ReadLine();
                
                match = line.IndexOf(matchstring);

                if (match == -1)
                {
                    filesb.AppendLine(line);
                }
                else
                {
                    lineschanged++;

                    linesb.Clear();

                    linesb.Append(line);

                    linesb.Remove(match, matchstring.Length);

                    linesb.Insert(0, matchstring);
                    
                    filesb.AppendLine(linesb.ToString());
                }
            }

            reader.Close();
        }

        if(lineschanged > 0)
        {
            using (StreamWriter writer = new StreamWriter(savefilepath))
            {
                writer.Write(filesb.ToString());
                writer.Close();
            }
        }
        else
        {
            MessageBox.Show("No matches found");
        }
    }
}


Maciej Los

:большой палец вверх:

BillWoodruff

спасибо, Мацей