Próbuję pisać do csv
pliku wiersz po rzędzie przy użyciu języka C #. Oto moja funkcja
string first = reader[0].ToString();
string second=image.ToString();
string csv = string.Format("{0},{1}\n", first, second);
File.WriteAllText(filePath, csv);
Cała funkcja działa w pętli, a każdy wiersz powinien być zapisany w csv
pliku. W moim przypadku następny wiersz zastępuje istniejący wiersz, a na końcu otrzymuję tylko jeden rekord w pliku csv, który jest ostatnim. Jak mogę zapisać wszystkie wiersze w csv
pliku?
StringBuilder
a następnie zapisz jeden?Util.WriteCsv (mydatacollection, @"c:\temp\data.csv");
Odpowiedzi:
AKTUALIZACJA
W dawnych naiwnych czasach zasugerowałem zrobienie tego ręcznie (było to proste rozwiązanie prostego pytania), jednak ze względu na to, że staje się to coraz bardziej popularne, polecam korzystanie z biblioteki CsvHelper, która wykonuje wszystkie kontrole bezpieczeństwa itp.
CSV jest o wiele bardziej skomplikowane niż sugeruje pytanie / odpowiedź.
Oryginalna odpowiedź
Ponieważ masz już pętlę, rozważ zrobienie tego w ten sposób:
Lub coś w tym celu. Moje rozumowanie brzmi: nie będziesz musiał pisać do pliku dla każdego elementu, otworzysz strumień tylko raz, a następnie napiszesz do niego.
Możesz wymienić
z
jeśli chcesz zachować poprzednie wersje csv w tym samym pliku
C # 6
Jeśli używasz c # 6.0, możesz wykonać następujące czynności
EDYTOWAĆ
Oto link do pytania, które wyjaśnia, co
Environment.NewLine
robi.źródło
{2}
iEnvironment.NewLine
i używaćAppendLine
zamiastAppend
System.Globalization.CultureInfo.CurrentCulture.TextInfo.ListSeparator
zamiast przecinka.Gorąco polecam wybranie bardziej nudnej trasy. Zwłaszcza jeśli twój plik jest duży.
File.AppendAllText()
otwiera nowy plik, zapisuje zawartość, a następnie zamyka plik. Otwieranie plików jest operacją znacznie obciążającą zasoby, niż zapisywanie danych w otwartym strumieniu. Otwarcie \ zamknięcie pliku w pętli spowoduje spadek wydajności.Podejście sugerowane przez Johna rozwiązuje ten problem, przechowując wszystkie dane wyjściowe w pamięci, a następnie zapisując je jeden raz. Jednak (w przypadku dużych plików) program zużywa dużo pamięci RAM, a nawet ulega awarii
OutOfMemoryException
Kolejną zaletą mojego rozwiązania jest to, że możesz zaimplementować pauzę \ wznawianie poprzez zapisanie bieżącej pozycji w danych wejściowych.
aktualiz. Umieszczono za pomocą we właściwym miejscu
źródło
using
oświadczeniu. W przeciwnym razie plik będzie cały czas otwierany ponownie.Ręczne pisanie plików csv może być trudne, ponieważ dane mogą zawierać przecinki i znaki nowej linii. Sugeruję użycie zamiast tego istniejącej biblioteki.
To pytanie wymienia kilka opcji.
Czy w C # są jakieś biblioteki czytników / programów piszących CSV?
źródło
Używam rozwiązania dwóch analiz, ponieważ jest ono bardzo łatwe w utrzymaniu
źródło
File.AppendAllLines(filePath, lines, Encoding.ASCII);
zamiastFile.WriteAllText(filePath, csv.ToString());
Więc robię coś bardzo przylegający. Po zbudowaniu pliku csv za pomocą StringBuilder przekształcam go w List <string>, aby uzyskać IEnumerable dla wywołania AppendAllLines, które nie zaakceptuje csv.ToString () jako parametru:List<string> lines = new List<string>(); lines.Add(csv.ToString(0, csv.Length));
czy masz lepszy sposób to zrobić?Zamiast dzwonić za każdym razem,
AppendAllText()
możesz pomyśleć o otwarciu pliku raz, a następnie napisać całą zawartość raz:źródło
Wystarczy użyć AppendAllText zamiast:
Jedynym minusem AppendAllText jest to, że zgłasza błąd, gdy plik nie istnieje, więc należy to sprawdzićPrzepraszam, blond chwilę przed przeczytaniem dokumentacji . W każdym razie metoda WriteAllText zastępuje wszystko, co zostało wcześniej zapisane w pliku, jeśli plik istnieje.
Zauważ, że twój obecny kod nie używa właściwych nowych linii, na przykład w Notatniku zobaczysz to wszystko jako jedną długą linię. Zmień kod na ten, aby mieć właściwe nowe wiersze:
źródło
Zamiast wynaleźć koło na nowo, można użyć biblioteki.
CsvHelper
doskonale nadaje się do tworzenia i czytania plików csv. Operacje odczytu i zapisu są oparte na strumieniu, dlatego też obsługują operacje z dużą ilością danych.Możesz napisać csv w następujący sposób.
Ponieważ biblioteka używa odbicia, pobierze dowolny typ i parsuje go bezpośrednio.
Jeśli chcesz dowiedzieć się więcej o konfiguracjach bibliotek i możliwościach, możesz to zrobić tutaj .
źródło
źródło
.Replace(",", ";") + ','
:?Obsługa przecinków
Do obsługi przecinków wewnątrz wartości podczas używania
string.Format(...)
, działało dla mnie:Aby połączyć to z odpowiedzią Johana, wyglądałoby to tak:
Zwracanie pliku CSV
Jeśli po prostu chcesz zwrócić plik zamiast zapisywać go w lokalizacji, jest to przykład tego, jak to zrobiłem:
Z procedury przechowywanej
Z listy
Mam nadzieję, że jest to pomocne.
źródło
Jest to prosty samouczek na temat tworzenia plików csv za pomocą C #, które będziesz mógł edytować i rozwijać w celu dostosowania do własnych potrzeb.
Najpierw musisz utworzyć nową aplikację konsolową Visual Studio C #. Aby to zrobić, należy wykonać następujące czynności.
Przykładowy kod utworzy plik csv o nazwie MyTest.csv w podanej lokalizacji. Zawartość pliku powinna mieć 3 nazwane kolumny z tekstem w pierwszych 3 wierszach.
https://tidbytez.com/2018/02/06/how-to-create-a-csv-file-with-c/
źródło
Konieczne może być dodanie nowego wiersza
"\n\r"
.źródło
Oto kolejna biblioteka open source do łatwego tworzenia pliku CSV, Cinchoo ETL
Aby uzyskać więcej informacji, przeczytaj artykuł CodeProject na temat użytkowania.
źródło
Jednym prostym sposobem na pozbycie się problemu z nadpisywaniem jest
File.AppendText
dodanie linii na końcu pliku jakoźródło
ciąg string_value = string.Empty;
źródło
To powinno pozwolić ci napisać plik csv po prostu. Stosowanie:
źródło