Saya mencoba untuk menulis ke sebuah csv
file baris demi baris menggunakan C# bahasa. Berikut adalah fungsi
string first = reader[0].ToString();
string second=image.ToString();
string csv = string.Format("{0},{1}\n", first, second);
File.WriteAllText(filePath, csv);
Seluruh fungsi berjalan dalam lingkaran, dan setiap baris harus ditulis dengan csv
file. Dalam kasus saya, baris berikutnya akan menimpa baris yang sudah ada dan pada akhirnya, saya mendapatkan hanya satu catatan dalam file csv yang terakhir. Bagaimana saya bisa menulis semua baris dalam csv
file?
UPDATE
Kembali saya naïve hari, saya menyarankan untuk melakukan hal ini secara manual (ini adalah solusi sederhana untuk pertanyaan sederhana), namun karena ini menjadi lebih dan lebih populer, saya'd sarankan menggunakan perpustakaan CsvHelper yang melakukan semua pemeriksaan keamanan, dll.
CSV merupakan cara yang lebih rumit dari apa pertanyaan/jawaban menunjukkan.
Jawaban Asli
Seperti yang anda sudah memiliki loop, pertimbangkan untuk melakukan hal seperti ini:
//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());
Atau sesuatu untuk efek ini. Alasan saya adalah: anda tidak't akan perlu untuk menulis ke file untuk setiap item, anda hanya akan membuka stream sekali dan kemudian menulis untuk itu.
Anda dapat mengganti
File.WriteAllText(filePath, csv.ToString());
dengan
File.AppendAllText(filePath, csv.ToString());
jika anda ingin menyimpan versi sebelumnya dari csv di file yang sama
C# 6
Jika anda menggunakan c# 6.0 kemudian anda dapat melakukan hal berikut
var newLine = $"{first},{second}"
EDIT
Berikut adalah link untuk pertanyaan yang menjelaskan apa yang Lingkungan.NewLine
tidak
Saya akan sangat menyarankan anda untuk pergi lebih membosankan rute. Terutama jika ukuran file lebih besar.
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()
membuka file baru, menulis konten, dan kemudian menutup file. Membuka file adalah banyak sumber daya-berat operasi, daripada menulis data ke stream. Pembukaan\menutup sebuah file di dalam sebuah lingkaran akan menyebabkan penurunan kinerja.
Pendekatan yang disarankan oleh Johan memecahkan masalah itu dengan menyimpan semua output dalam memori dan kemudian menulis sekali. Namun (dalam kasus file-file besar) program anda akan mengkonsumsi sejumlah besar RAM dan bahkan crash dengan OutOfMemoryException
Keuntungan lain dari solusi saya adalah bahwa anda dapat menerapkan jeda\melanjutkan dengan menyimpan posisi saat ini dalam input data.
upd. Ditempatkan di tempat yang tepat
Menulis file csv dengan tangan dapat menjadi sulit karena data anda mungkin mengandung koma dan baris baru. Saya sarankan anda menggunakan perpustakaan yang ada gantinya.
Pertanyaan ini menyebutkan beberapa pilihan.
Saya menggunakan dua mengurai solusi seperti itu's sangat mudah untuk mempertahankan
// Prepare the values
var allLines = (from trade in proposedTrades
select new object[]
{
trade.TradeType.ToString(),
trade.AccountReference,
trade.SecurityCodeType.ToString(),
trade.SecurityCode,
trade.ClientReference,
trade.TradeCurrency,
trade.AmountDenomination.ToString(),
trade.Amount,
trade.Units,
trade.Percentage,
trade.SettlementCurrency,
trade.FOP,
trade.ClientSettlementAccount,
string.Format("\"{0}\"", trade.Notes),
}).ToList();
// Build the file content
var csv = new StringBuilder();
allLines.ForEach(line =>
{
csv.AppendLine(string.Join(",", line));
});
File.WriteAllText(filePath, csv.ToString());
Cukup gunakan AppendAllText sebagai gantinya:
File.AppendAllText(filePath, csv);
Maaf, rambut pirang sejenak sebelum membaca dokumentasi. Pokoknya, WriteAllText metode menimpa apa pun yang ditulis sebelumnya dalam file, jika file yang ada.
Perhatikan bahwa kode anda saat ini tidak tepat menggunakan garis baru, misalnya di Notepad anda'll melihat itu semua sebagai satu garis panjang. Mengubah kode ini untuk mendapatkan baris baru:
string csv = string.Format("{0},{1}{2}", first, image, Environment.NewLine);
Alih-alih memanggil setiap saat AppendAllText()
anda harus berpikir tentang membuka file sekali dan kemudian menulis seluruh isi sekali:
var file = @"C:\myOutput.csv";
using (var stream = File.CreateText(file))
{
for (int i = 0; i < reader.Count(); i++)
{
string first = reader[i].ToString();
string second = image.ToString();
string csvRow = string.Format("{0},{1}", first, second);
stream.WriteLine(csvRow);
}
}
Bukan reinventing the wheel perpustakaan dapat digunakan. CsvHelper
lebih besar untuk membuat dan membaca file csv. It's membaca dan menulis operasi stream berbasis dan karena itu juga mendukung operasi dengan sejumlah besar data.
Anda dapat menulis csv anda seperti berikut ini.
using(var textWriter = new StreamWriter(@"C:\mypath\myfile.csv"))
{
var writer = new CsvWriter(textWriter);
writer.Configuration.Delimiter = ",";
foreach (var item in list)
{
writer.WriteField( "a" );
writer.WriteField( 2 );
writer.WriteField( true );
writer.NextRecord();
}
}
Sebagai perpustakaan menggunakan refleksi itu akan mengambil semua jenis dan mengurai secara langsung.
public class CsvRow
{
public string Column1 { get; set; }
public bool Column2 { get; set; }
public CsvRow(string column1, bool column2)
{
Column1 = column1;
Column2 = column2;
}
}
IEnumerable<CsvRow> rows = new [] {
new CsvRow("value1", true),
new CsvRow("value2", false)
};
using(var textWriter = new StreamWriter(@"C:\mypath\myfile.csv")
{
var writer = new CsvWriter(textWriter);
writer.Configuration.Delimiter = ",";
writer.WriteRecords(rows);
}
value1,benar
value2,palsu
Jika anda ingin membaca lebih lanjut tentang librarys konfigurasi dan kemungkinan-kemungkinan yang dapat anda lakukan agar di sini.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;
using System.Configuration;
using System.Data.SqlClient;
public partial class CS : System.Web.UI.Page
{
protected void ExportCSV(object sender, EventArgs e)
{
string constr = ConfigurationManager.ConnectionStrings["constr"].ConnectionString;
using (SqlConnection con = new SqlConnection(constr))
{
using (SqlCommand cmd = new SqlCommand("SELECT * FROM Customers"))
{
using (SqlDataAdapter sda = new SqlDataAdapter())
{
cmd.Connection = con;
sda.SelectCommand = cmd;
using (DataTable dt = new DataTable())
{
sda.Fill(dt);
//Build the CSV file data as a Comma separated string.
string csv = string.Empty;
foreach (DataColumn column in dt.Columns)
{
//Add the Header row for CSV file.
csv += column.ColumnName + ',';
}
//Add new line.
csv += "\r\n";
foreach (DataRow row in dt.Rows)
{
foreach (DataColumn column in dt.Columns)
{
//Add the Data rows.
csv += row[column.ColumnName].ToString().Replace(",", ";") + ',';
}
//Add new line.
csv += "\r\n";
}
//Download the CSV file.
Response.Clear();
Response.Buffer = true;
Response.AddHeader("content-disposition", "attachment;filename=SqlExport.csv");
Response.Charset = "";
Response.ContentType = "application/text";
Response.Output.Write(csv);
Response.Flush();
Response.End();
}
}
}
}
}
}
var newLine = string.Format("\"{0}\",\"{1}\",\"{2}\"",
first,
second,
third
);
csv.AppendLine(newLine);
Sehingga untuk menggabungkan dengan Johan's jawaban, it'd terlihat seperti ini:
//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());
public FileContentResults DownloadCSV()
{
// I have a stored procedure that queries the information I need
SqlConnection thisConnection = new SqlConnection("Data Source=sv12sql;User ID=UI_Readonly;Password=SuperSecure;Initial Catalog=DB_Name;Integrated Security=false");
SqlCommand queryCommand = new SqlCommand("spc_GetInfoINeed", thisConnection);
queryCommand.CommandType = CommandType.StoredProcedure;
StringBuilder sbRtn = new StringBuilder();
// If you want headers for your file
var header = string.Format("\"{0}\",\"{1}\",\"{2}\"",
"Name",
"Address",
"Phone Number"
);
sbRtn.AppendLine(header);
// Open Database Connection
thisConnection.Open();
using (SqlDataReader rdr = queryCommand.ExecuteReader())
{
while (rdr.Read())
{
// rdr["COLUMN NAME"].ToString();
var queryResults = string.Format("\"{0}\",\"{1}\",\"{2}\"",
rdr["Name"].ToString(),
rdr["Address"}.ToString(),
rdr["Phone Number"].ToString()
);
sbRtn.AppendLine(queryResults);
}
}
thisConnection.Close();
return File(new System.Text.UTF8Encoding().GetBytes(sbRtn.ToString()), "text/csv", "FileName.csv");
}
/* To help illustrate */
public static List<Person> list = new List<Person>();
/* To help illustrate */
public class Person
{
public string name;
public string address;
public string phoneNumber;
}
/* The important part */
public FileContentResults DownloadCSV()
{
StringBuilder sbRtn = new StringBuilder();
// If you want headers for your file
var header = string.Format("\"{0}\",\"{1}\",\"{2}\"",
"Name",
"Address",
"Phone Number"
);
sbRtn.AppendLine(header);
foreach (var item in list)
{
var listResults = string.Format("\"{0}\",\"{1}\",\"{2}\"",
item.name,
item.address,
item.phoneNumber
);
sbRtn.AppendLine(listResults);
}
}
return File(new System.Text.UTF8Encoding().GetBytes(sbRtn.ToString()), "text/csv", "FileName.csv");
}
Mudah-mudahan ini bermanfaat.
Ini adalah tutorial sederhana tentang cara membuat file csv menggunakan C# bahwa anda akan dapat mengedit dan memperluas sesuai dengan kebutuhan anda sendiri.
Pertama, anda akan perlu untuk membuat Visual Studio C# console, aplikasi, ada langkah-langkah untuk mengikuti untuk melakukan hal ini.
Contoh kode yang akan membuat file csv yang disebut MyTest.csv di lokasi yang anda tentukan. Isi dari file tersebut harus 3 bernama kolom dengan teks dalam 3 baris.
https://tidbytez.com/2018/02/06/how-to-create-a-csv-file-with-c/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
namespace CreateCsv
{
class Program
{
static void Main()
{
// Set the path and filename variable "path", filename being MyTest.csv in this example.
// Change SomeGuy for your username.
string path = @"C:\Users\SomeGuy\Desktop\MyTest.csv";
// Set the variable "delimiter" to ", ".
string delimiter = ", ";
// This text is added only once to the file.
if (!File.Exists(path))
{
// Create a file to write to.
string createText = "Column 1 Name" + delimiter + "Column 2 Name" + delimiter + "Column 3 Name" + delimiter + Environment.NewLine;
File.WriteAllText(path, createText);
}
// This text is always added, making the file longer over time
// if it is not deleted.
string appendText = "This is text for Column 1" + delimiter + "This is text for Column 2" + delimiter + "This is text for Column 3" + delimiter + Environment.NewLine;
File.AppendAllText(path, appendText);
// Open the file to read from.
string readText = File.ReadAllText(path);
Console.WriteLine(readText);
}
}
}
Salah satu cara sederhana untuk menyingkirkan timpa masalah adalah dengan menggunakan File.AppendText
untuk menambahkan baris ini di akhir file
void Main()
{
using (System.IO.StreamWriter sw = System.IO.File.AppendText("file.txt"))
{
string first = reader[0].ToString();
string second=image.ToString();
string csv = string.Format("{0},{1}\n", first, second);
sw.WriteLine(csv);
}
}
Berikut ini adalah perpustakaan open source untuk membuat file CSV dengan mudah, Cinchoo ETL
List<dynamic> objs = new List<dynamic>();
dynamic rec1 = new ExpandoObject();
rec1.Id = 10;
rec1.Name = @"Mark";
rec1.JoinedDate = new DateTime(2001, 2, 2);
rec1.IsActive = true;
rec1.Salary = new ChoCurrency(100000);
objs.Add(rec1);
dynamic rec2 = new ExpandoObject();
rec2.Id = 200;
rec2.Name = "Tom";
rec2.JoinedDate = new DateTime(1990, 10, 23);
rec2.IsActive = false;
rec2.Salary = new ChoCurrency(150000);
objs.Add(rec2);
using (var parser = new ChoCSVWriter("emp.csv").WithFirstLineHeader())
{
parser.Write(objs);
}
Untuk informasi lebih lanjut, silakan baca CodeProject artikel pada penggunaan.
Anda mungkin hanya perlu menambahkan baris feed "\n\r"
.