Piszę prostą aplikację do importowania i muszę odczytać plik CSV, pokazać wynik w a DataGrid
i pokazać uszkodzone linie pliku CSV w innej siatce. Na przykład pokaż linie, które są krótsze niż 5 wartości w innej siatce. Próbuję to zrobić w ten sposób:
StreamReader sr = new StreamReader(FilePath);
importingData = new Account();
string line;
string[] row = new string [5];
while ((line = sr.ReadLine()) != null)
{
row = line.Split(',');
importingData.Add(new Transaction
{
Date = DateTime.Parse(row[0]),
Reference = row[1],
Description = row[2],
Amount = decimal.Parse(row[3]),
Category = (Category)Enum.Parse(typeof(Category), row[4])
});
}
ale w tym przypadku bardzo trudno jest operować na tablicach. Czy jest lepszy sposób na podzielenie wartości?
Odpowiedzi:
Nie wynajduj koła na nowo. Skorzystaj z tego, co już jest w .NET BCL.
Microsoft.VisualBasic
(tak, mówi VisualBasic, ale działa równie dobrze w C # - pamiętaj, że na końcu to wszystko jest po prostu IL)Microsoft.VisualBasic.FileIO.TextFieldParser
klasy do przeanalizowania pliku CSVOto przykładowy kod:
Świetnie sprawdza się w moich projektach C #.
Oto więcej linków / informacji:
źródło
TextFieldParser
i zadziałało. Dziękiparser.TextFieldType = FieldType.Delimited;
nie jest konieczne w przypadku wywołaniaparser.SetDelimiters(",");
, ponieważ metoda ustawiaTextFieldType
właściwość za Ciebie."text with quote"", and comma"
, i uzyskać poprawną wartośćtext with quote", and comma
zamiast błędnie rozdzielonych wartości. Więc możesz zdecydować się na String.Split, jeśli csv jest bardzo proste.Z mojego doświadczenia wynika, że istnieje wiele różnych formatów CSV. W szczególności, jak radzą sobie ze ucieczką cudzysłowów i ograniczników w polu.
Oto warianty, z którymi się spotkałem:
Wypróbowałem wiele istniejących parserów csv, ale nie ma ani jednego, który mógłby obsłużyć warianty, z którymi się spotkałem. Trudno jest również dowiedzieć się z dokumentacji, które uciekające warianty obsługują parsery.
W moich projektach używam teraz VB TextFieldParser lub niestandardowego rozdzielacza.
źródło
Polecam CsvHelper firmy Nuget .
(Dodanie odniesienia do Microsoft.VisualBasic po prostu nie wydaje się właściwe, jest nie tylko brzydkie, prawdopodobnie nie jest nawet wieloplatformowe).
źródło
CsvHelper
ma wbudowany wiersz do mapowania klas; dopuszcza różnice w nagłówkach kolumn (jeśli są obecne), a nawet pozorne różnice w kolejności kolumn (chociaż sam nie testowałem tego ostatniego). W sumie wydaje się to o wiele bardziej „wysokiego poziomu” niżTextFieldParser
.Czasami korzystanie z bibliotek jest fajne, gdy nie chcesz wymyślać koła na nowo, ale w tym przypadku można wykonać tę samą pracę z mniejszą liczbą wierszy kodu i łatwiejszym do odczytania w porównaniu do korzystania z bibliotek. Oto inne podejście, które uważam za bardzo łatwe w użyciu.
źródło
CSV można uzyskać skomplikowane prawdziwe szybko.
Użyj czegoś solidnego i dobrze przetestowanego:
FileHelpers: www.filehelpers.net
źródło
Używam tego tutaj:
http://www.codeproject.com/KB/database/GenericParser.aspx
Ostatnim razem, gdy szukałem czegoś takiego, znalazłem to jako odpowiedź na to pytanie .
źródło
Kolejny na tej liście, Cinchoo ETL - biblioteka open source do odczytu i zapisu plików CSV
Przykładowy plik CSV poniżej
Szybko możesz je załadować za pomocą biblioteki, jak poniżej
Jeśli masz klasę POCO pasującą do pliku CSV
Możesz go użyć do załadowania pliku CSV, jak poniżej
Sprawdź artykuły w CodeProject jak z niego korzystać.
Zastrzeżenie: jestem autorem tej biblioteki
źródło
źródło
Przede wszystkim musisz zrozumieć, czym jest CSV i jak go napisać.
/r/n
) to kolejny wiersz „tabeli”.\t
lub,
/r/n
symbole (komórka musi zaczynać się od symbolu cudzysłowu i kończy się tym symbolem w tym przypadku)Najłatwiejszym sposobem pracy C # / Visual Basic z plikami CSV jest użycie
Microsoft.VisualBasic
biblioteki standardowej . Musisz tylko dodać potrzebne odniesienie i następujący ciąg do swojej klasy:Tak, możesz go używać w C #, nie martw się. Ta biblioteka może czytać stosunkowo duże pliki i obsługuje wszystkie potrzebne reguły, więc będziesz mógł pracować ze wszystkimi plikami CSV.
Jakiś czas temu na podstawie tej biblioteki napisałem prostą klasę do odczytu / zapisu CSV. Używając tej prostej klasy będziesz w stanie pracować z CSV jak z tablicą 2 wymiarów. Możesz znaleźć moją klasę pod następującym linkiem: https://github.com/ukushu/DataExporter
Prosty przykład użycia:
źródło
Aby uzupełnić poprzednie odpowiedzi, można potrzebować kolekcji obiektów z jego pliku CSV, przeanalizowanych albo metodą
TextFieldParser
albostring.Split
, a następnie każdej linii przekonwertowanej na obiekt przez odbicie. Oczywiście najpierw musisz zdefiniować klasę, która pasuje do wierszy pliku CSV.Użyłem prostego Serializatora CSV od Michaela Kropata, który znalazł tutaj: Klasa ogólna do CSV (wszystkie właściwości) i ponownie użyłem jego metod, aby uzyskać pola i właściwości żądanej klasy.
Deserializuję plik CSV za pomocą następującej metody:
źródło
Gorąco polecam użycie CsvHelper.
Oto krótki przykład:
Pełną dokumentację można znaleźć pod adresem : https://joshclose.github.io/CsvHelper
źródło