C # вставить строку в многострочную строку - PullRequest
3 голосов
/ 04 августа 2011

У меня есть многострочная строка (из txt-файла с использованием ReadAllText).строка выглядит следующим образом:

R;0035709310000026542510X0715;;;  
R;0035709310000045094410P1245;;;  
R;0035709310000026502910Z1153;;;

Я хочу поставить ";"в каждой строке на месте 22, так это выглядит так:

R;00357093100000265425;10X0715;;;  
R;00357093100000450944;10P1245;;;  
R;00357093100000265029;10Z1153;;;

Многострочная строка всегда содержит один и тот же объем данных, но не всегда 3 строки - иногда больше строк.

Как сделатьЯ делаю это?Пожалуйста, покажите какой-нибудь код.

Большое спасибо :-) С наилучшими пожеланиями, Бент

Ответы [ 6 ]

5 голосов
/ 04 августа 2011

Попробуйте это ...

using System.IO;
using System.Linq;

var lines = File.ReadAllLines("data.txt");
var results = lines.Select(x => x.Insert(22, ";"));
4 голосов
/ 04 августа 2011

Шаг 1, не используйте ReadAllText ().Вместо этого используйте ReadAllLines ().

 string[] myLinesArray = File.ReadAllLines(...);

Шаг 2, замените все строки (строки) измененной версией.

for(int i = 0; i < myLinesArray.Length; i++)
    myLinesArray[i] = myLinesArray[i].Insert(22, ";");

Шаг 3, используйте WriteAllLines ()

1 голос
/ 04 августа 2011

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

Вы можете создать свой новый файл в StringBuilder или, если он большой, написатьэто новый файл, используемый для замены источника в конце.

Примерно так:

using System.IO;

string tempFileName = Path.GetTempFileName();

using (StreamWriter target = File.CreateText(tempFileName))
{
    using(StreamReader source = file.OpenText("YourSourceFile.???"))
    {
        while (source.Peek() >= 0)
        {
            target.WriteLine(source.ReadLine().Insert(22, ";"));
        }
    }
}

File.Delete("YourSourceFile.???");
File.Move(tempFileName, "YourSourceFile.???");

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

1 голос
/ 04 августа 2011

попробуйте

string s ="R;0035709310000026542510X0715;;;";
s = s.Insert(22,";");
Console.Write(s);

или используйте Regex

    string s =@"R;0035709310000026542510X0715;;;
R;0035709310000045094410P1245;;;
R;0035709310000026502910Z1153;;;";
    string resultString = Regex.Replace(s, "^.{22}", "$0;", RegexOptions.IgnoreCase | RegexOptions.Multiline);
    Console.Write(resultString);
0 голосов
/ 04 августа 2011

Как предложено, вы можете использовать метод Вставка для достижения своей цели.

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

0 голосов
/ 04 августа 2011

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

myString = Regex.Replace(myString, @"(^.{22})", @"\1;", RegexOptions.Multiline);

Пояснение: у вас есть 3 строковых аргумента:

  • 1-й вход является
  • 2-й шаблон
  • 3-я строка - замена

В шаблоне:

  • () - это группа захвата: вы можете вызвать ее в строке замещения, где \ n, где n - это индекс группы захвата в шаблоне, основанный на 1. В этом случае \ 1 - это то, что соответствует "(^. {22})"
  • «^» - это начало строки (потому что мы устанавливаем многострочные параметры, иначе это будет начало входной строки)
  • "" соответствует любому символу
  • {22} означает, что вам нужен предшествующий шаблон (в данном случае «.», Любой символ) 22 раза

Итак, что это значит: «в любой строке с 22 символами или более замените 22 первых символа теми же 22 символами плюс»; «

...