当前位置: 首页 > article >正文

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;  
    }  
}

代码说明

  1. 使用 StreamReader:代码使用 StreamReader 来读取 CSV 文件,确保对文件的访问是安全的,并在操作完成后自动释放资源。

  2. 重试逻辑:在读取文件时,代码会捕获 IOException,并在文件被占用时重试最多 5 次。

  3. 行转对象转换ConvertCsvLineToObject<T> 方法用于将 CSV 行转换为指定类型的对象。您需要根据您的对象类型具体实现赋值逻辑。

  4. 扩展名检查:确保文件是 CSV 格式,如果不是,跳过该文件。

注意事项

  • 请确保处理 CSV 中的数据时,根据您的实际数据格式和对象属性进行赋值。
  • 如果 CSV 的分隔符不是逗号,您可以调整 line.Split(',') 为相应的分隔符。
  • 在实际使用中,您可能需要为 ConvertCsvLineToObject 方法添加更复杂的逻辑,以匹配目标对象的结构。

http://www.kler.cn/a/401586.html

相关文章:

  • 生成式语言模型 三范式 预训练、微调、强化反馈学习
  • k8s上部署redis高可用集群
  • 编程语言02:语法基础
  • c++数字雨实现
  • leetcode-44-通配符匹配
  • 如何合理设计一套springcloud+springboot项目中的各个微服务模块之间的继承关系的最优方案
  • 机器学习的全面解析:从基础到应用
  • # JVM学习
  • 基于YOLOv8深度学习的婴儿情绪状态检测系统(PyQt5界面+数据集+训练代码)
  • Ubuntu20.04 Rk3588 交叉编译ffmpeg7.0
  • 疫情下的图书馆管理系统:Spring Boot实现
  • 【MCU】GD32H7定时器使用外部时钟源
  • 01 IP路由基础
  • 集群聊天服务器(13)redis环境安装和发布订阅命令
  • 电子应用设计方案-13:智能消毒柜系统方案设计
  • 【LangChain】LangChain框架快速入门
  • html本地离线引入vant和vue2(详细步骤)
  • 《Python制作动态爱心粒子特效》
  • 【C语言】操作符2(含操作符的应用)
  • 小学知识相关链接
  • 阿里云轻量应用服务器可以用在哪些场景呢
  • 《YOLO:目标检测领域的璀璨之星》
  • 网络安全之信息收集-实战-2
  • 青训营刷题笔记09
  • 【mongodb】社区版8:改变配置bindip和授权
  • Spire.PDF for .NET【页面设置】演示:更改 PDF 页面大小