zoukankan      html  css  js  c++  java
  • csv 文件的读取

    因为工作中会接触到许多不同的数据库,像 oracle,access,mssql,mysql,db2 等,比较杂。

    所以一直想做一个通用的数据查询工具,支持所有的数据库,操作界面统一为 mssql 2005 的界面,这样可以少安装很多客户端工具,也不需要在不同的数据库客户端工具之间切换来切换去了。

    先放一个初始的截图,和mssql的操作界面一样,左边是表、列信息显示区,右上是 sql 语句录入区,右下是结果显示区

    支持表和字段的自动提示,支持 csv,excel 的导入导出

    ps:图中连接的数据库为 IBM DB2 9.5

     

    在做数据导入导出功能时,最基本的 csv 文件格式一定要支持吧,当时就想 csv还不简单,无非就是逗号分隔,回车换行的文本文件吗,很快就写出来了


    最初的 csv 读取
    public static string[][] read_csv(string text)
    {
        var text_array 
    = new List<string[]>();
        
    string[] lines = text.Split('\r''\n');
        
    foreach (var line in lines)
        {
            
    if (!string.IsNullOrEmpty(line))
            {
                
    string[] fields = line.Split(',');
                text_array.Add(fields);
            }
        }
        
    return text_array.ToArray();
    }


    public   text)
    {
      lines)
    .IsNullOrEmpty(line))
    );
                text_array.Add(words);
            }
     text_array.ToArray();

    开始一切都好,没遇到什么问题,后来用的多了,问题开始出现了,发现有些 csv的字段中含有逗号,这下完了,遇到逗号就当成另外一个字段了,当然会报错,原来当初太轻视 csv 文件了,呵呵,实际上csv 也是有一些需要注意的规范的。

    1.如果csv文件字段中有特殊字符,整个字段应该用双引号包起来

       特殊字符有三种, 逗号[,]    回车换行[\r\n]    和处于字段开头的双引号["]

       例如:字段   a,     b,c(b,c 文本中包含逗号)       ,d      

                就应该变成    a,"b,c",d

                有回车换行的也是一样 

    2.如果 csv字段中有特殊字符,并且字段中含有双引号,则字段中的双引号应该写两次

        例如:字段  a,     b,c"aa      ,d

                 就应该变成   a,"b,c""aa",d

     有了这两个规范,把读取方法重新修改一下就完了,也不复杂

    修改后的 csv 读取
    public static string[][] read_csv(string text)
    {
        
    if (text == null)
            
    return null;
        var text_array 
    = new List<string[]>();
        var line 
    = new List<string>();
        var field 
    = new StringBuilder();
        
    //是否在双引号内
        bool in_quata = false;
        
    //字段是否开始
        bool field_start = true;
        
    for (int i = 0; i < text.Length; i++)
        {
            
    char ch = text[i];
            
    if (in_quata)
            {
                
    //如果已经处于双引号范围内
                if (ch == '\"')
                {
                    
    //如果是两个引号,则当成一个普通的引号处理
                    if (i < text.Length - 1 && text[i + 1== '\"')
                    {
                        field.Append(
    '\"');
                        i
    ++;
                    }
                    
    else
                        
    //否则退出引号范围
                        in_quata = false;
                }
                
    else //双引号范围内的任何字符(除了双引号)都当成普通字符
                {
                    field.Append(ch);
                }
            }
            
    else
            {
                
    switch (ch)
                {
                    
    case ','//新的字段开始
                        line.Add(field.ToString());
                        field.Remove(
    0, field.Length);
                        field_start 
    = true;
                        
    break;
                    
    case '\"'://引号的处理
                        if (field_start)
                            in_quata 
    = true;
                        
    else
                            field.Append(ch);
                        
    break;
                    
    case '\r'//新的记录行开始
                        if (field.Length > 0 || field_start)
                        {
                            line.Add(field.ToString());
                            field.Remove(
    0, field.Length);
                        }
                        text_array.Add(line.ToArray());
                        line.Clear();
                        field_start 
    = true;
                        
    //在 window 环境下,\r\n通常是成对出现,所以要跳过
                        if (i < text.Length - 1 && text[i + 1== '\n')
                            i
    ++;
                        
    break;
                    
    default:
                        field_start 
    = false;
                        field.Append(ch);
                        
    break;
                }
            }
        }
        
    //文件结束
        if (field.Length > 0 || field_start)
            line.Add(field.ToString());
        
    if (line.Count > 0)
            text_array.Add(line.ToArray());
        
    return text_array.ToArray();
    }

    经过修改后,基本上就没遇到什么问题了。

  • 相关阅读:
    hdoj2187:悼念512汶川大地震遇难同胞 (贪心)
    2.0其它之Transform详解,以及UIElement和FrameworkElement的常用属性
    2.0外观之样式, 模板, 视觉状态和视觉状态管理器
    2.0图形之Ellipse, Line, Path, Polygon, Polyline, Rectangle
    2.0控件之ListBox, MediaElement, MultiScaleImage, PasswordBox, ProgressBar, RadioButton
    2.0画笔之SolidColorBrush, ImageBrush, VideoBrush, LinearGradientBrush, RadialGradientBrush
    2.0图形之基类System.Windows.Shapes.Shape
    2.0交互之鼠标事件和键盘事件
    2.0控件之ScrollViewer, Slider, StackPanel, TabControl, TextBlock, TextBox, ToggleButton
    2.0交互之InkPresenter(涂鸦板)
  • 原文地址:https://www.cnblogs.com/michaelhuwei/p/1946104.html
Copyright © 2011-2022 走看看