Как я могу элегантно реализовать несколько замен строк в одном файле? - PullRequest
1 голос
/ 12 апреля 2011

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

File.WriteAllText(filePath, Regex.Replace(File.ReadAllText(filePath),
    "( " + column.Key + " )",
    " " + column.Value + " "
));
File.WriteAllText(filePath, Regex.Replace(File.ReadAllText(filePath),
    "(\\[\"" + column.Key + "\"\\])",
    "[\"" + column.Value + "\"]"
));

Однако каждая замена открывает и закрывает файл, и иногда кажется, что они запускаются «слишком быстро», и одна замена не будет работать, поскольку файл еще не закрылся при предыдущей замене строки. Есть ли какой-нибудь код, который я могу использовать повторно, чтобы решить эту проблему, возможно, используя класс FileStream (чтобы я мог открываться и закрываться один раз)? Или предложения о лучшем способе сделать это? Просто интересно, есть ли что-то более простое, чем я могу сделать, чем создавать байтовые массивы строк, которые я хочу заменить, и писать код для чтения, записи и поиска байтов вручную. Спасибо.

Ответы [ 6 ]

4 голосов
/ 12 апреля 2011

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

3 голосов
/ 12 апреля 2011

Ну, я бы использовал:

 string text = File.ReadAllText(filePath);

 text = Regex.Replace(...);
 text = Regex.Replace(...);
 ...
 File.WriteAllText(filePath, text);

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

2 голосов
/ 12 апреля 2011
string contents = File.ReadAllText(filePath);
contents = Regex.Replace(contents,
    "( " + column.Key + " )",
    " " + column.Value + " ");
contents = Regex.Replace(contents,
    "(\\[\"" + column.Key + "\"\\])",
    "[\"" + column.Value + "\"]");
File.WriteAllText(filePath, contents);
1 голос
/ 12 апреля 2011

Ну, самый простой метод - ReadAllText, сделайте замену, а затем WriteAllText.

var text = File.ReadAllText(filePath);
text = Regex.Replace(text,"( " + column.Key + " )"," " + column.Value + " ");
text = Regex.Replace(text,"(\\[\"" + column.Key + "\"\\])","[\"" + column.Value + "\"]");
File.WriteAllText(text,filePath);
1 голос
/ 12 апреля 2011
var fileContents = File.ReadAllText(filePath);
fileContents = Regex.Replace(fileContents,
    "( " + column.Key + " )",
    " " + column.Value + " "
);
fileContents = Regex.Replace(fileContents ,
    "(\\[\"" + column.Key + "\"\\])",
    "[\"" + column.Value + "\"]"
);
File.WriteAllText(filePath, fileContents);
1 голос
/ 12 апреля 2011

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

...