Member 14765136 Ответов: 2

Как заменить данные в txt-файле с помощью textbox'e


У меня есть txt файл который выглядит так:

City;Temp;location; Weather value;
Ryga;-3;C:\Users\abc\Desktop\Orai\Video\;overcast;
Tallinn;-2;C:\Users\abc\Desktop\Orai\Video\;overcast;
Moscow;-2;C:\Users\abc\Desktop\Orai\Video\;fog;
Minsk;+4;C:\Users\abc\Desktop\Orai\Video\;overcast;


Что мне нужно, так это перезаписать выделенные жирным шрифтом значения одним нажатием кнопки со значениями, которые я ввел в Textbox'e:

Рига.Текст
Таллин.Текст
Москва.Текст
Минск.Текст

P. S это мой первый раз, когда я кладу руки на C#.
Я уверен, что это не самый оптимальный путь.

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

var filepath = Orai.Default.txtBox + "\\Europe.txt";
            string strFile = File.ReadAllText(filepath);
            var items = strFile.Split(';');
            strFile = strFile.Replace(items[5], ryga.Text);
            strFile = strFile.Replace(items[9], tallin.Text);
            strFile = strFile.Replace(items[13], moscow.Text);
            strFile = strFile.Replace(items[17], minsk.Text);
            File.WriteAllText(filepath, strFile);

2 Ответов

Рейтинг:
4

MadMyche

Если это что-то, что будет делаться на регулярной основе; или вы просто хотите построить свои знания, вы должны понять, что это не является обычный текст файл - это на самом деле очерченный текст.
Точки с запятой разбивают это на столбцы, и там определенно есть точка с запятой. заголовок строка в верхней части файла

City;		Temp;	location;							Weather value;
Ryga;		-3;		C:\Users\abc\Desktop\Orai\Video\;	overcast;
Tallinn;	-2;		C:\Users\abc\Desktop\Orai\Video\;	overcast;
Moscow;		-2;		C:\Users\abc\Desktop\Orai\Video\;	fog;
Minsk;		+4;		C:\Users\abc\Desktop\Orai\Video\;	overcast;
Теперь, когда мы все это видим, мы действительно можем создать Class чтобы представить эти данные:
public class WeatherInfo {
	public string City { get; set; }
	public int Temperature { get; set; }
	public string Location { get; set; }
	public string Weather { get; set; }
}
Теперь мы знаем, что такое данные, и у нас есть класс для представления одной строки. Давайте посмотрим на чтение вашего файла...
Мы можем прочитать ваш файл с этим неполным кодом
string[] lines = File.ReadAllLines( filename );

for (int l=0; l <= lines.length - 1, l++) {
	if (l > 0) { // we will skip the first line which is the header(0-indexed)
		string row = lines[l];
		string[] col = row.Split(','); // splitting this up on the semi-colon
		// TODO: Process the columns- col[0], col[1], col[2], col[3]
	}
}
Так что же нам теперь делать... и как это мне поможет?
Мы собираемся создать List (или другой тип сбора) сообщенных наблюдений, и когда мы проходим через каждую строку выше, мы можем добавить объект к этому списку
List<WeatherInfo> WeatherReports = new List<WeatherInfo>();
// begin loop
	WeatherInfo report = new WeatherInfo();
		report.City = // value;
		report.Temperature = // value
		report.Location = // value
		report.Weather = // value

	WeatherReports.Add(report);
// end loop
Таким образом, мы получили отдельные куски этого..
Давайте объединим эти разделы, чтобы связать их все вместе!
string[] lines = File.ReadAllLines( filename );
List<WeatherInfo> WeatherReports = new List<WeatherInfo>();

for (int l=0; l <= lines.length - 1, l++) {
	if (l > 0) {
		string row = lines[l];
		string[] col = row.Split(',');

		WeatherInfo report = new WeatherInfo();
			report.City = col[0];
			report.Temperature = col[1];
			report.Location = col[2];
			report.Weather = col[3];
		WeatherReports.Add(report);
	}
}
И я до сих пор не ответил на твой вопрос.... ну, ты действительно не сказал мне, что заменить... Глядя на это я могу только догадываться что вы хотите изменить местоположение которое кажется немного шаткий и, скорее всего, потребуется редактирование.
Если это будет ... статическое значение во всех случаях вы можете просто изменить строку для report.Temperature.

Теперь, как я могу получить свой текстовый файл обратно... вы просто обращаете процесс вспять.
StringBuilder sb = new StringBuilder();
sb.AppendLine(lines[0]); // we can keep that header row as is

foreach(WeatherInfo wi in WeatherReports) {
	sb.AppendLine("{0},{1},{2},{3}, wi.City, wi.Temperature, wi.Location, we.Weather);
}

string NewTextContent = sb.ToString();
Я надеюсь, что это поможет вам и покажет, как вы действительно можете перепроектировать простой запрос


Рейтинг:
20

OriginalGriff

Цитата:
Я уверен, что это не самый оптимальный путь.

Вы будете удивлены ...

Текстовые файлы не содержат "строк".

Да, да, я знаю - вы можете читать и писать строки, поэтому очевидно, что они содержат их. Но на практике это не так - они содержат поток символов, некоторые из которых интерпретируются как "новая строка" программным обеспечением, считывающим файл. Когда вы "читаете строку", программа считывает каждый символ, пока не доберется до следующего символа новой строки (в C# это можно увидеть как '\n'), и возвращает все символы, которые она прочитала, как одну строку - "строку". Когда вы пишете строку, ваш текст записывается в строку и к ней добавляется символ новой строки.

Это важно знать, потому что это означает, что вы не можете просто "удалить строку" или "вставить строку" в текстовый файл. Для этого вам нужно создать новый файл.
Чтобы удалить строку:
1) Copy all the text up to the start of the line from the old file to the new file.
2) Find the end of the line to delete without copying it.
3) Copy all the text up to the end of the file from the old file to the new file.
4) Close both files.
5) Delete the original file, and rename the new file to become the old one.


Чтобы вставить строку:
1) Copy all the text up to the start of the line before which you want to insert the new line from the old file to the new file.
2) Write your new text to the new file, with a newline character at the end.
3) Copy all the text up to the end of the file from the old file to the new file.
4) Close both files.
5) Delete the original file, and rename the new file to become the old one.

Есть способы перейти к определенному символу в файле (см. метод поиска), а затем заменить его другим, и когда вы хотите изменить значение, например "-2" на "-4", это нормально, но "+10" становится проблемой, потому что длина строки должна измениться.

Я бы придерживался того, что у вас есть - это, вероятно, более оптимально, чем вы могли бы подумать!