Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 用C语言将数据写入CSV文件#_C#_File_Csv - Fatal编程技术网

C# 用C语言将数据写入CSV文件#

C# 用C语言将数据写入CSV文件#,c#,file,csv,C#,File,Csv,我正在尝试使用C语言逐行写入csv文件。这是我的功能 string first = reader[0].ToString(); string second=image.ToString(); string csv = string.Format("{0},{1}\n", first, second); File.WriteAllText(filePath, csv); 整个函数在一个循环中运行,每一行都应该写入csv文件。在我的例子中,下一行覆盖现有行,最后,我在csv文件中只得到一条记录,这

我正在尝试使用C语言逐行写入
csv
文件。这是我的功能

string first = reader[0].ToString();
string second=image.ToString();
string csv = string.Format("{0},{1}\n", first, second);
File.WriteAllText(filePath, csv);

整个函数在一个循环中运行,每一行都应该写入
csv
文件。在我的例子中,下一行覆盖现有行,最后,我在csv文件中只得到一条记录,这是最后一条记录。如何写入
csv
文件中的所有行

您可以使用
附录文本

File.AppendAllText(filePath, csv);
正如政府所说:

如果目标文件已存在,则会覆盖该文件

另外,请注意,您当前的代码没有使用正确的新行,例如,在记事本中,您将看到所有代码都是一条长行。将代码更改为此,以便有适当的新行:

string csv = string.Format("{0},{1}{2}", first, image, Environment.NewLine);

更新

回到我的天真时代,我建议手动执行此操作(这是一个简单问题的简单解决方案),但是由于此操作越来越流行,我建议使用执行所有安全检查的库,等等

CSV比问题/答案所暗示的要复杂得多

原始答案

既然你已经有了一个循环,考虑一下这样做:

//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());
//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());
或者类似的东西。 我的理由是:您不需要为每个项目写入文件,只需打开流一次,然后再写入

你可以替换

File.WriteAllText(filePath, csv.ToString());

如果要将以前版本的csv保留在同一文件中

C#6

如果您使用的是c#6.0,那么您可以执行以下操作

var newLine = $"{first},{second}"
编辑


下面是一个问题的答案,解释了
环境。NewLine
的作用。

我强烈建议您选择更乏味的路线。尤其是当你的文件很大的时候

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()
打开一个新文件,写入内容,然后关闭该文件。打开文件比将数据写入开放流要耗费大量资源。打开\关闭循环中的文件将导致性能下降

Johan建议的方法通过将所有输出存储在内存中,然后编写一次来解决这个问题。但是(在大文件的情况下),您的程序将消耗大量RAM,甚至会因
OutOfMemoryException

我的解决方案的另一个优点是,您可以通过在输入数据中保存当前位置来实现暂停\恢复


upd。使用放置在正确的位置

而不是每次调用
AppendAllText()
您可以考虑打开文件一次,然后编写整个内容一次:

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);
    }
}
var file=@“C:\myOutput.csv”;
使用(var stream=File.CreateText(文件))
{
对于(int i=0;i
我使用双解析解决方案,因为它很容易维护

// 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());

您可能只需要添加换行符“\n\r”

手动编写csv文件可能很困难,因为您的数据可能包含逗号和换行符。我建议你改用现有的图书馆

这个问题提到了几个选择

处理逗号 在使用
string.Format(…)
时,为了处理值中的逗号,我采用了以下方法:

var newLine = string.Format("\"{0}\",\"{1}\",\"{2}\"",
                              first,
                              second,
                              third                                    
                              );
csv.AppendLine(newLine);
所以把它和约翰的答案结合起来,它看起来是这样的:

//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());
//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());

返回CSV文件 如果您只是想返回文件,而不是将其写入某个位置,下面是我如何完成的示例:

从存储过程 从列表中
/*以帮助说明*/
公共静态列表=新列表();
/*帮助说明*/
公共阶层人士
{
公共字符串名称;
公共字符串地址;
公共字符串电话号码;
}
/*重要部分*/
公共文件内容结果下载CSV()
{
StringBuilder sbRtn=新的StringBuilder();
//如果您想要文件的标题
var header=string.Format(“\”{0}\”、“{1}\”、“{2}\”,
“姓名”,
“地址”,
“电话号码”
);
sbRtn.附录行(标题);
foreach(列表中的变量项)
{
var listResults=string.Format(“\”{0}\”、“{1}\”、“{2}\”,
item.name,
项目.地址:,
item.phoneNumber
);
sbRtn.附录行(列表结果);
}
}
返回文件(new System.Text.UTF8Encoding().GetBytes(sbRtn.ToString()),“Text/csv”,“FileName.csv”);
}

希望这会有所帮助。

可以使用库,而不是重新发明轮子
CsvHelper
非常适合创建和读取csv文件。它的读写操作是基于流的,因此也支持具有大量数据的操作


您可以像下面这样编写csv

using(var textWriter = new StreamWriter(@"C:\mypath\myfile.csv"))
{
    var writer = new CsvWriter(textWriter, CultureInfo.InvariantCulture);
    writer.Configuration.Delimiter = ",";

    foreach (var item in list)
    {
        writer.WriteField( "a" );
        writer.WriteField( 2 );
        writer.WriteField( true );
        writer.NextRecord();
    }
}

由于库使用反射,它将采用任何类型并直接解析它

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, CultureInfo.InvariantCulture);
    writer.Configuration.Delimiter = ",";
    writer.WriteRecords(rows);
}
公共类CsvRow
{
公共字符串Column1{get;set;}
公共布尔列2{get;set;}
公共CsvRow(字符串列1,布尔列2)
{
第1列=第1列;
第2列=第2列;
}
}
IEnumerable rows=new[]{
新CsvRow(“值1”,正确),
新CsvRow(“值2”,错误)
};
使用(var textWriter=newstreamWriter(@“C:\mypath\myfile.csv”)
{
var writer=新的CsvWriter(textWriter,CultureInfo.InvariantCulture);
writer.Configuration.Delimiter=“,”;
writer.WriteRecords(行);
}
值1,对

值2,错误



如果您想了解更多关于library配置和可能性的信息,可以这样做。

这里是另一个可以轻松创建CSV文件的开源库

List objs=new List();
dynamic rec1=新的ExpandooObject();
rec1.Id=10;
记录1
using(var textWriter = new StreamWriter(@"C:\mypath\myfile.csv"))
{
    var writer = new CsvWriter(textWriter, CultureInfo.InvariantCulture);
    writer.Configuration.Delimiter = ",";

    foreach (var item in list)
    {
        writer.WriteField( "a" );
        writer.WriteField( 2 );
        writer.WriteField( true );
        writer.NextRecord();
    }
}
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, CultureInfo.InvariantCulture);
    writer.Configuration.Delimiter = ",";
    writer.WriteRecords(rows);
}
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);
}
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);
        }
    }
}
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);
    }
} 
enter code here
        for (int i = 0; i < ur_grid.Rows.Count; i++)
        {
            for (int j = 0; j < ur_grid.Rows[i].Cells.Count; j++)
            {
                if (!string.IsNullOrEmpty(ur_grid.Rows[i].Cells[j].Text.ToString()))
                {
                    if (j > 0)
                        string_value= string_value+ "," + ur_grid.Rows[i].Cells[j].Text.ToString();
                    else
                    {
                        if (string.IsNullOrEmpty(string_value))
                            string_value= ur_grid.Rows[i].Cells[j].Text.ToString();
                        else
                            string_value= string_value+ Environment.NewLine + ur_grid.Rows[i].Cells[j].Text.ToString();
                    }
                }
            }
        }


        string where_to_save_file = @"d:\location\Files\sample.csv";
        File.WriteAllText(where_to_save_file, string_value);

        string server_path = "/site/Files/sample.csv";
        Response.ContentType = ContentType;
        Response.AppendHeader("Content-Disposition", "attachment; filename=" + Path.GetFileName(server_path));
        Response.WriteFile(server_path);
        Response.End();
public static class Extensions
{
    public static void WriteCSVLine(this StreamWriter writer, IEnumerable<string> fields)
    {
        const string q = @"""";
        writer.WriteLine(string.Join(",",
            fields.Select(
                v => (v.Contains(',') || v.Contains('"') || v.Contains('\n') || v.Contains('\r')) ? $"{q}{v.Replace(q, q + q)}{q}" : v
                )));
    }

    public static void WriteFields(this StreamWriter writer, params string[] fields) => WriteFields(writer, (IEnumerable<string>)fields);
}
StreamWriter writer = new StreamWriter("myfile.csv");
writer.WriteCSVLine(new[]{"A", "B"});