Практическое руководство. Изменение порядка полей файла с разделителями (LINQ)
Файл, со значениями, разделенными запятыми (CSV), является текстовым файлом, который часто используется для хранения данных электронной таблицы или других табличных данных, представленных строками и столбцами. С помощью метода Split для разделения полей к CSV-файлам несложно осуществлять запросы и управлять ими, используя LINQ. Та же технология может использоваться для изменения порядка частей любой структурированной строки текста; она не ограничена CSV-файлами.
Предположим, что в следующем примере три столбца представляют фамилии, имена и идентификаторы учащихся. Поля упорядочены по алфавиту в соответствии с фамилиями учащихся. Запрос создает новую последовательность, в которой сначала идет столбец идентификатора, а за ним — второй столбец, который объединяет имя и фамилию. Строки переупорядочиваются в соответствии с полем идентификатора. Результаты сохраняются в новый файл, исходные данные не изменяются.
Создание файла данных
Создайте новый проект Visual C# или Visual Basic и скопируйте следующие строки в простой текстовый файл с именем spreadsheet1.csv. Сохраните файл в папке решения.
Adams,Terry,120 Fakhouri,Fadi,116 Feng,Hanying,117 Garcia,Cesar,114 Garcia,Debra,115 Garcia,Hugo,118 Mortensen,Sven,113 O'Donnell,Claire,112 Omelchenko,Svetlana,111 Tucker,Lance,119 Tucker,Michael,122 Zabokritski,Eugene,121
Пример
Class CSVFiles
Shared Sub Main()
' Create the IEnumerable data source.
Dim lines As String() = System.IO.File.ReadAllLines("../../../spreadsheet1.csv")
' Execute the query. Put field 2 first, then
' reverse and combine fields 0 and 1 from the old field
Dim lineQuery = From line In lines
Let x = line.Split(New Char() {","})
Order By x(2)
Select x(2) & ", " & (x(1) & " " & x(0))
' Execute the query and write out the new file. Note that WriteAllLines
' takes a string array, so ToArray is called on the query.
System.IO.File.WriteAllLines("../../../spreadsheet2.csv", lineQuery.ToArray())
' Keep console window open in debug mode.
Console.WriteLine("Spreadsheet2.csv written to disk. Press any key to exit")
Console.ReadKey()
End Sub
End Class
' Output to spreadsheet2.csv:
' 111, Svetlana Omelchenko
' 112, Claire O'Donnell
' 113, Sven Mortensen
' 114, Cesar Garcia
' 115, Debra Garcia
' 116, Fadi Fakhouri
' 117, Hanying Feng
' 118, Hugo Garcia
' 119, Lance Tucker
' 120, Terry Adams
' 121, Eugene Zabokritski
' 122, Michael Tucker
class CSVFiles
{
static void Main(string[] args)
{
// Create the IEnumerable data source
string[] lines = System.IO.File.ReadAllLines(@"../../../spreadsheet1.csv");
// Create the query. Put field 2 first, then
// reverse and combine fields 0 and 1 from the old field
IEnumerable<string> query =
from line in lines
let x = line.Split(',')
orderby x[2]
select x[2] + ", " + (x[1] + " " + x[0]);
// Execute the query and write out the new file. Note that WriteAllLines
// takes a string[], so ToArray is called on the query.
System.IO.File.WriteAllLines(@"../../../spreadsheet2.csv", query.ToArray());
Console.WriteLine("Spreadsheet2.csv written to disk. Press any key to exit");
Console.ReadKey();
}
}
/* Output to spreadsheet2.csv:
111, Svetlana Omelchenko
112, Claire O'Donnell
113, Sven Mortensen
114, Cesar Garcia
115, Debra Garcia
116, Fadi Fakhouri
117, Hanying Feng
118, Hugo Garcia
119, Lance Tucker
120, Terry Adams
121, Eugene Zabokritski
122, Michael Tucker
*/
Компиляция кода
Создайте проект Visual Studio, предназначенный для .NET Framework версии 3.5. По умолчанию в проекте имеются ссылка на файл System.Core.dll и директива using (C#) или оператор Imports (Visual Basic) для пространства имен System.Linq. При работе с проектами C# добавьте директиву using для пространства имен System.IO.
Скопируйте этот код в проект.
Нажмите клавишу F5, чтобы скомпилировать и выполнить программу.
Нажмите любую клавишу для выхода из окна консоли.
См. также
Задачи
Как сформировать XML на основе CSV-файлов