Можно ли преобразовать массив строк в одну строку?

в моей программе я читаю в файле, используя этот оператор:

string[] allLines = File.ReadAllLines(dataFile);  

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

Regex r = new Regex(@"CREATE TABLE [^(]+((.*)) ON");  

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

есть ли способ, чтобы изменить массив обратно в один текстовый файл? Или любое другое решение проблемы?
Вещи, которые появляются в моем уме, заменяют "вещи", которые меня не волнуют string.Empty.

пример файла

USE [Shelleys Other Database]
CREATE TABLE db.exmpcustomers(
    f_name varchar(100) NULL,
    l_name varchar(100) NULL,
    date_of_birth date NULL,
    house_number int NULL,
    street_name varchar(100) NULL
) ON [PRIMARY]

7 ответов


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

Не забудьте использовать это для сопоставления регулярных выражений, чтобы оно соответствовало новым строкам:

Regex r = new Regex(@"CREATE TABLE [^(]+((.*)) ON", RegexOptions.SingleLine);

вы можете объединить string[] в одну строку, как это

string strmessage=string.join(",",allLines);

вывод: - одна, разделенная строка.


можно использовать String.Join():

string joined = String.Join(Environment.NewLine, allLines);

Если вы просто хотите записать его обратно в файл, вы можете использовать File.WriteAllLines() и это работает с массивом.


String.Join объединит все члены вашего массива, используя любой указанный разделитель.


просто измените с

string[] allLines = File.ReadAllLines(dataFile);

to

string allLines = File.ReadAllText(dataFile);

;)


не могли бы вы создать буфер, как Вы читаете в каждой строке? У меня есть идея, что это может быть немного эффективнее, чем получить все строки в виде строкового массива, а затем присоединиться к ним (...хотя я не сделал полного изучения этого вопроса и был бы заинтересован услышать, Есть ли какая-то причина, по которой на самом деле более эффективно идти этим путем).

StringBuilder buffer = new StringBuilder();
string line = null;
using (StreamReader sr = new StreamReader(dataFile))
{
    while((line = sr.ReadLine()) != null)
    {
        // Do whatever you need to do with the individual line...
        // ...then append the line to your buffer.
        buffer.Append(line); 
    }
}
// Now, you can do whatever you need to do with the contents of
// the buffer.
string wholeText = buffer.ToString();

public string CreateStringFromArray(string[] allLines)
{        
StringBuilder builder = new StringBuilder();
        foreach (string item in allLines)
        {
             builder.Append(item);
             //Appending Linebreaks
             builder.Append("\n\l");
        }
        return builder.ToString();  
}