下面我将详细讲解“C#导出数据到CSV文件的通用类实例”的完整攻略,过程中将会包含两条示例说明。
前言
CSV (Comma Separated Values) 文件是一种通用的数据交换格式,它能很好地被许多程序读取。在本文中,我们将会学习如何用 C# 导出数据到 CSV 文件中,这将会涉及以下几个步骤:
- 创建 CSV 文件
- 将数据存入 CSV 文件
- 转义数据
- 读取 CSV 文件
创建 CSV 文件
在 C# 中,创建一个 CSV 文件并不难。首先,我们需要引入以下几个命名空间:
using System.IO;
using System.Text;
然后,我们可以定义一个 CSV 文件的路径:
string csvFilePath = "path/to/file.csv";
接下来,我们可以创建一个 StreamWriter 对象,用于写入数据到 CSV 文件中:
using (StreamWriter sw = new StreamWriter(csvFilePath, false, Encoding.UTF8))
{
// Write data to CSV file
}
在代码中,我们使用 StreamWriter
类创建一个写入流,参数 false
表示在写入文件时不要追加,Encoding.UTF8
表示使用 UTF-8 编码写入数据。
将数据存入 CSV 文件
在创建好 CSV 文件后,现在我们需要将数据存入其中。通常情况下,我们会将数据表头和数据记录以逗号为分隔符拼成一行,然后在写入 CSV 文件时将每行数据用换行符分隔。
下面是其中一个示例,假设数据存储在一个 List
对象中,数据表头为 Name
和 Age
:
// Define data
List<string> headers = new List<string> { "Name", "Age" };
List<List<string>> data = new List<List<string>> {
new List<string> { "John", "20" },
new List<string> { "Mike", "25" },
new List<string> { "Lucy", "22" },
};
// Write data to CSV file
using (StreamWriter sw = new StreamWriter(csvFilePath, false, Encoding.UTF8))
{
// Write headers
sw.Write(string.Join(",", headers));
sw.Write(sw.NewLine);
// Write data
foreach (var row in data)
{
sw.Write(string.Join(",", row));
sw.Write(sw.NewLine);
}
}
在代码中,我们首先定义了数据表头和数据记录。然后,我们使用 StreamWriter
写入数据到 CSV 文件中。我们首先写入数据表头,用 string.Join
方法将表头列表中的所有元素以逗号拼接为一个字符串,然后用 StreamWriter.Write
方法写入到文件中,并在末尾加上一个换行符。接着,我们使用 foreach
循环遍历数据记录列表,用 string.Join
方法将每行数据(也就是一个 List<string>
对象)中的所有元素以逗号拼接为字符串,然后写入到 CSV 文件中,并在末尾加上一个换行符。
转义数据
在将数据存入 CSV 文件时,我们需要对某些特殊字符进行转义,以保证 CSV 文件的正确性。常见的特殊字符包括逗号(,
)、双引号("
)和换行符(\n
)等。当某个数据记录中包含了这些特殊字符时,我们需要对其进行转义,以避免出现错误。
下面是一个示例,当数据表中的某条记录中包含逗号和双引号时,我们需要对其进行转义:
List<string> row = new List<string> { "John,Doe", "20", "\"a\"b\"" };
string rowData = string.Join(",", row.Select(s => "\"" + s.Replace("\"", "\"\"") + "\""));
// Output: John,Doe,20,"""a""b"""
在代码中,我们定义了一个数据记录 row
,其中包含了逗号和双引号。我们用 string.Join
方法将 row
中的元素以逗号拼接为一个字符串,然后对其中的所有双引号进行了转义(替换为两个双引号)。
读取 CSV 文件
除了导出数据到 CSV 文件中,我们还需要能够读取 CSV 文件中的数据。要实现这个功能,我们可以使用 C# 中自带的 TextFieldParser
类来解析 CSV 文件。
下面是一个示例,假设我们需要读取一个名为 data.csv
的 CSV 文件中的数据:
using Microsoft.VisualBasic.FileIO;
string csvFilePath = "path/to/file.csv";
List<string> headers = new List<string>();
List<List<string>> data = new List<List<string>>();
using (TextFieldParser parser = new TextFieldParser(csvFilePath, Encoding.UTF8))
{
parser.TextFieldType = FieldType.Delimited;
parser.SetDelimiters(",");
bool isFirstRow = true;
while (!parser.EndOfData)
{
string[] fields = parser.ReadFields();
if (isFirstRow)
{
headers = fields.ToList();
isFirstRow = false;
}
else
{
data.Add(fields.ToList());
}
}
}
在代码中,我们首先定义了 CSV 文件的路径,然后创建了一个空的数据表头列表和数据记录列表。接着,我们使用 TextFieldParser
类读取 CSV 文件中的数据。我们首先指定了字段分隔符和字段类型,然后使用 ReadFields
方法逐行读取 CSV 文件中的数据。我们判断读取的是否为表头行,如果是则将其作为表头存储到 headers
列表中,否则将其作为一行记录存储到 data
列表中。
示例说明
我们已经完成了关于“C#导出数据到CSV文件的通用类实例”的完整攻略。下面给出两个示例来说明如何使用上述代码。
示例一:导出数据到 CSV 文件
假设我们已经有了一个数据表 users
,其中包含每个用户的姓名、年龄和手机号码。现在我们需要将这个数据表的内容导出到一个名为 users.csv
的 CSV 文件中。
下面是示例代码:
// Define data
var users = new List<Dictionary<string, string>> {
new Dictionary<string, string> { { "Name", "John" }, { "Age", "20" }, { "Phone", "123456" } },
new Dictionary<string, string> { { "Name", "Mary" }, { "Age", "25" }, { "Phone", "234567" } },
new Dictionary<string, string> { { "Name", "Lucy" }, { "Age", "22" }, { "Phone", "345678" } },
};
var headers = new List<string> { "Name", "Age", "Phone" };
// Write data to CSV file
using (StreamWriter sw = new StreamWriter("users.csv", false, Encoding.UTF8))
{
// Write headers
sw.Write(string.Join(",", headers));
sw.Write(sw.NewLine);
// Write data
foreach (var user in users)
{
var row = new List<string>();
foreach (var header in headers)
{
var value = user.ContainsKey(header) ? user[header] : "";
row.Add(value);
}
sw.Write(string.Join(",", row));
sw.Write(sw.NewLine);
}
}
在代码中,我们首先定义了数据表 users
和数据表头 headers
。然后,我们使用 StreamWriter
类将数据导出到 CSV 文件中。我们首先写入数据表头,然后遍历数据表 users
中的每一行,将其中的每一个元素按照表头顺序插入到一个新的列表中,并将所有元素拼接成一个字符串,然后写入到 CSV 文件中。
示例二:读取 CSV 文件中的数据
假设我们已经创建好了一个名为 users.csv
的 CSV 文件,其中包含每个用户的姓名、年龄和手机号码。现在我们需要从这个文件中读取数据,并存储为一个数据表 users
。
下面是示例代码:
// Read data from CSV file
string csvFilePath = "users.csv";
List<string> headers = new List<string>();
List<Dictionary<string, string>> users = new List<Dictionary<string, string>>();
using (TextFieldParser parser = new TextFieldParser(csvFilePath, Encoding.UTF8))
{
parser.TextFieldType = FieldType.Delimited;
parser.SetDelimiters(",");
bool isFirstRow = true;
while (!parser.EndOfData)
{
string[] fields = parser.ReadFields();
if (isFirstRow)
{
headers = fields.ToList();
isFirstRow = false;
}
else
{
var user = new Dictionary<string, string>();
for (int i = 0; i < fields.Length; i++)
{
user.Add(headers[i], fields[i]);
}
users.Add(user);
}
}
}
// Print users
foreach (var user in users)
{
Console.WriteLine("Name: {0}, Age: {1}, Phone: {2}", user["Name"], user["Age"], user["Phone"]);
}
在代码中,我们使用 TextFieldParser
类读取 CSV 文件中的数据。我们首先指定了字段分隔符和字段类型,然后使用 ReadFields
方法逐行读取 CSV 文件中的数据。我们判断读取的是否为表头行,如果是则将其存储到 headers
列表中,否则将其转化为一个字典,将字典存储到 users
列表中。最后,我们遍历 users
列表,将其中的每个元素按照需求输出到控制台上。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#导出数据到CSV文件的通用类实例 - Python技术站