Bandau įrašyti į csv
failą eilutę po eilutės naudodamas C# kalbą. Štai mano funkcija
string first = reader[0].ToString();
string second=image.ToString();
string csv = string.Format("{0},{1}\n", first, second);
File.WriteAllText(filePath, csv);
Visa funkcija veikia ciklo viduje, ir kiekviena eilutė turi būti įrašyta į csv
failą. Mano atveju kita eilutė perrašo esamą eilutę, todėl galiausiai csv faile gaunamas tik vienas įrašas, kuris yra paskutinis. Kaip į csv
failą įrašyti visas eilutes?
PATIKSLINIMAS
Kai dar buvau naivus, siūliau tai daryti rankiniu būdu (tai buvo paprastas sprendimas paprastam klausimui), tačiau dėl to, kad tai tampa vis populiaresnis dalykas, rekomenduočiau naudoti biblioteką CsvHelper, kuri atlieka visus saugumo patikrinimus ir t. t.
CSV yra kur kas sudėtingesnis dalykas, nei siūloma klausime/atsakyme.
Pradinis atsakymas
Kadangi jau turite ciklą, apsvarstykite galimybę daryti taip:
//before your loop
var csv = new StringBuilder();
//in your loop
var first = reader[0].ToString();
var second = image.ToString();
//Suggestion made by KyleMit
var newLine = string.Format("{0},{1}", first, second);
csv.AppendLine(newLine);
//after your loop
File.WriteAllText(filePath, csv.ToString());
Arba kažką panašaus. Mano argumentai: jums nereikės rašyti į failą kiekvieno elemento, jūs tik vieną kartą atidarysite srautą ir tada į jį rašysite.
Galite pakeisti
File.WriteAllText(filePath, csv.ToString());
į
File.AppendAllText(filePath, csv.ToString());
jei norite išsaugoti ankstesnes csv versijas tame pačiame faile
C# 6
Jei naudojate c# 6.0, galite atlikti šiuos veiksmus
var newLine = $"{first},{second}"
EDIT
Čia yra nuoroda į klausimą, kuriame paaiškinta, ką daro Environment.NewLine
Labai rekomenduočiau rinktis nuobodesnį kelią. Ypač jei jūsų failo dydis yra didelis.
using(var w = new StreamWriter(path))
{
for( /* your loop */)
{
var first = yourFnToGetFirst();
var second = yourFnToGetSecond();
var line = string.Format("{0},{1}", first, second);
w.WriteLine(line);
w.Flush();
}
}
File.AppendAllText()
atidaro naują failą, įrašo turinį ir uždaro failą. Failų atidarymas yra daug daugiau išteklių reikalaujanti operacija nei duomenų rašymas į atvirą srautą. Atidarant\uždarant failą ciklo viduje, sumažės našumas.
Johano pasiūlytas metodas išsprendžia šią problemą, nes visą išvestį saugo atmintyje, o paskui ją įrašo vieną kartą. Tačiau (jei failai dideli) programa sunaudos daug operatyviosios atminties ir net suges su OutOfMemoryException
.
Kitas mano sprendimo privalumas yra tas, kad galite įgyvendinti pauzę ir atnaujinimą išsaugodami dabartinę poziciją įvesties duomenyse.
atnaujinimas. Pateikta naudojant tinkamoje vietoje
Vietoj to paprasčiausiai naudokite AppendAllText:
File.AppendAllText(filePath, csv);
Vienintelis AppendAllText trūkumas yra tas, kad jis išmeta klaidą, kai failas neegzistuoja, todėl tai reikia patikrinti
Atsiprašau, blondinė akimirką prieš skaitydama dokumentaciją. Šiaip ar taip, metodas WriteAllText perrašo viską, kas anksčiau buvo įrašyta į failą, jei failas egzistuoja.
Atkreipkite dėmesį, kad jūsų dabartiniame kode nenaudojamos tinkamos naujos eilutės, pavyzdžiui, "Notepad" programoje viską matysite kaip vieną ilgą eilutę. Pakeiskite kodą į šį, kad būtų tinkamos naujos eilutės:
string csv = string.Format("{0},{1}{2}", first, image, Environment.NewLine);