CSV 文件读取
下面是整体代码片段的示例,确保从文件中读取数据并处理异常情况:
CSV 文件读取示例
using System;
using System.Collections.Generic;
using System.IO;
public class CsvReader
{
public List<T> ReadCsv<T>(string filePath, object paras, int start) where T : new()
{
var list = new List<T>();
// 检查文件扩展名
if (filePath.IndexOf(".csv", StringComparison.OrdinalIgnoreCase) > 0)
{
const int maxRetries = 5; // 最大重试次数
int attempts = 0;
bool fileReadSuccessfully = false;
// 尝试读取文件
while (attempts < maxRetries && !fileReadSuccessfully)
{
try
{
using (var reader = new StreamReader(filePath))
{
int currentLineIndex = 0;
while (!reader.EndOfStream)
{
var line = reader.ReadLine();
if (currentLineIndex >= start) // 从指定的起始行开始处理
{
T obj = ConvertCsvLineToObject<T>(line, paras); // 自定义方法,将CSV行转换为对象
list.Add(obj);
}
currentLineIndex++;
}
}
fileReadSuccessfully = true; // 如果没有异常,标记读取成功
}
catch (IOException)
{
attempts++;
System.Threading.Thread.Sleep(1000); // 停顿1秒再重试
}
}
if (!fileReadSuccessfully)
{
throw new IOException($"无法访问文件 '{filePath}',请确认文件未被其他程序占用。");
}
}
return list;
}
// 将CSV行转换为对象的示例方法
private T ConvertCsvLineToObject<T>(string line, object paras) where T : new()
{
string[] values = line.Split(',');
T obj = new T();
// 这里需要根据实际的 T 类型实现转换逻辑
// 假定 T 是一个类,并且你要用反射或直接赋值来填充 obj 的属性
// 例:赋值逻辑示例
// if (typeof(T) == typeof(YourClassType))
// {
// var yourObj = (YourClassType)(object)obj;
// yourObj.Property1 = values[0];
// yourObj.Property2 = values[1];
// // 继续赋值......
// }
return obj;
}
}
代码说明
-
使用
StreamReader
:代码使用StreamReader
来读取 CSV 文件,确保对文件的访问是安全的,并在操作完成后自动释放资源。 -
重试逻辑:在读取文件时,代码会捕获
IOException
,并在文件被占用时重试最多 5 次。 -
行转对象转换:
ConvertCsvLineToObject<T>
方法用于将 CSV 行转换为指定类型的对象。您需要根据您的对象类型具体实现赋值逻辑。 -
扩展名检查:确保文件是 CSV 格式,如果不是,跳过该文件。
注意事项
- 请确保处理 CSV 中的数据时,根据您的实际数据格式和对象属性进行赋值。
- 如果 CSV 的分隔符不是逗号,您可以调整
line.Split(',')
为相应的分隔符。 - 在实际使用中,您可能需要为
ConvertCsvLineToObject
方法添加更复杂的逻辑,以匹配目标对象的结构。