Jak dotąd mój kod
StreamReader reading = File.OpenText("test.txt");
string str;
while ((str = reading.ReadLine())!=null)
{
if (str.Contains("some text"))
{
StreamWriter write = new StreamWriter("test.txt");
}
}
Wiem, jak znaleźć tekst, ale nie mam pojęcia, jak zamienić tekst w pliku na własny.
c#
.net
io
streamreader
file-handling
Win Coder
źródło
źródło
Odpowiedzi:
Przeczytaj całą zawartość pliku. Dokonaj wymiany za pomocą
String.Replace
. Zapisz zawartość z powrotem do pliku.źródło
Regex.Replace
System out of memory
wyjątek.Będzie ci ciężko pisać do tego samego pliku, z którego czytasz. Jednym z szybkich sposobów jest zrobienie tego:
Możesz to lepiej rozłożyć
źródło
ReadAllText
zamyka dostęp do plików przedWriteAllText
. Używam tej właśnie techniki we własnej aplikacji.Musisz zapisać wszystkie czytane wiersze do pliku wyjściowego, nawet jeśli ich nie zmieniasz.
Coś jak:
Jeśli chcesz wykonać tę operację na miejscu, najłatwiejszym sposobem jest użycie tymczasowego pliku wyjściowego i na końcu zastąpienie pliku wejściowego wynikiem.
(Próba wykonania operacji aktualizacji w środku pliku tekstowego jest raczej trudna do wykonania, ponieważ zawsze posiadanie zamiennika tej samej długości jest trudne, biorąc pod uwagę, że większość kodowań ma zmienną szerokość).
EDYCJA: Zamiast dwóch operacji na plikach w celu zastąpienia oryginalnego pliku, lepiej użyć
File.Replace("input.txt", "output.txt", null)
. (Zobacz MSDN ).źródło
Prawdopodobnie będziesz musiał przeciągnąć plik tekstowy do pamięci, a następnie dokonać wymiany. Będziesz wtedy musiał nadpisać plik przy użyciu metody, o której dobrze wiesz. Więc najpierw:
Następnie możesz przejrzeć i zamienić tekst w tablicy.
ta metoda daje ci pewną kontrolę nad możliwymi manipulacjami. Lub możesz po prostu dokonać zamiany w jednej linii
Mam nadzieję, że to pomoże.
źródło
Tak to zrobiłem z dużym (50 GB) plikiem:
Wypróbowałem 2 różne sposoby: pierwszy, wczytanie pliku do pamięci i użycie Regex Replace lub String Replace. Następnie dołączyłem cały ciąg do pliku tymczasowego.
Pierwsza metoda działa dobrze w przypadku kilku zamian Regex, ale Regex.Replace lub String.Replace może spowodować błąd braku pamięci, jeśli wykonasz wiele zamian w dużym pliku.
Drugi polega na odczytaniu pliku tymczasowego wiersz po wierszu i ręcznym utworzeniu każdego wiersza przy użyciu StringBuilder i dołączeniu każdego przetworzonego wiersza do pliku wynikowego. Ta metoda była dość szybka.
źródło
źródło
staram się używać prostego kodu do przodu tak często, jak tylko mogę, poniższy kod działał dobrze ze mną
źródło