#c# #file #parsing
#c# #файл #разбор
Вопрос:
Я хочу прочитать info1.txt файл и хотите записать в другой текстовый файл info2.txt таким образом.
Id Name Address DOB Phone 1 abcd efg 1/16/2021 987654323 2 hijkl mno 2/16/2021 678987652
Содержание info1.txt файл выглядит следующим образом:
Id:1 Name:abcd Address:efg DOB:1/16/2021 3:31:22 PM Phone:987654323
И в info2.txt будет похоже на формат таблицы выше,о котором я упоминал, также хочу удалить «3:31:22 вечера». Блок кода, который я разработал для решения этой проблемы, доступен ниже:
static void Main(string[] args) { FileStream fsRead = new FileStream("E:\info1.txt", FileMode.Open, FileAccess.Read); StreamReader srObj = new StreamReader(fsRead); FileStream fsWrite = new FileStream("E:\info2.txt", FileMode.Create, FileAccess.Write); StreamWriter swObj = new StreamWriter(fsWrite); while (srObj.Peek() gt; 0) { string str; string[] strArray; str = srObj.ReadLine(); str = str.Replace(" 3:31:22 PM", ""); strArray = str.Split(':'); if (strArray.Length gt; 1) { swObj.Write(strArray[1]); swObj.Write(" "); } } swObj.Close(); fsWrite.Close(); srObj.Close(); fsRead.Close(); Console.ReadKey(); }
Комментарии:
1. Эта строка:
1/16/2021 3:31:22 PM
является строковым представлениемDateTime
объекта. Это:1/16/2021
также является строковым представлением даты-времени (возможно, той же даты-времени). Если вы хотите избавиться от компонента времени, позвоните.Date
(что приведет к обнулению временных частей даты-времени). Или вы можете просто отформатировать его по-другому. Не делайте того, что вы делаете (редактируйте его из строки), просто отформатируйте его по-другому
Ответ №1:
Я бы проанализировал файл в виде списка словарей, где ключами каждого словаря являются столбцы.
Сначала разделите строки файла на массив строк. Вы можете использовать File.ReadAllLines
для этого. Затем отправьте массив в эту функцию, которая анализирует строки.
public static Listlt;Dictionarylt;string, stringgt;gt; Parse(string [] lines) { Listlt;Dictionarylt;string, stringgt;gt; data = new Listlt;Dictionarylt;string, stringgt;gt;(); Dictionarylt;string, stringgt; temp = new Dictionarylt;string, stringgt;(); foreach (var line in lines) { var parts = line.Split(new[] { ':' }, 2); if (parts.Length == 2) { temp[parts[0]] = parts[1]; } else { if (temp.Count gt; 0) data.Add(temp); temp = new Dictionarylt;string, stringgt;(); } } if (temp.Count gt; 0) data.Add(temp); return data; }
Затем создайте функцию для записи списка в файл.
public static void PrintTable(Listlt;Dictionarylt;string, stringgt;gt; users, TextWriter stream) { if (users.Count == 0) return; // Print the header line foreach(var pair in users[0]) { stream.Write("{0,-12}", pair.Key); } stream.WriteLine(); foreach (var user in users) { foreach(var pair in user) { // Special handling for DOB if (pair.Key == "DOB") stream.Write("{0,-12}", pair.Value.Split(' ')[0]); else stream.Write("{0,-12}", pair.Value); } stream.WriteLine(); } }