CSV文件解析

CSV(逗号分隔值文件格式)

逗号分隔值(Comma-Separated Values,CSV,有时也称为字符分隔值,因为分隔字符也可以不是逗号),其文件以纯文本形式存储表格数据(数字和文本)。纯文本意味着该文件是一个字符序列,不含必须像二进制数字那样被解读的数据。CSV文件由任意数目的记录组成,记录间以某种换行符分隔;每条记录由字段组成,字段间的分隔符是其它字符或字符串,最常见的是逗号或制表符。通常,所有记录都有完全相同的字段序列。CSV文件格式的通用标准并不存在,但是在RFC 4180中有基础性的描述。使用的字符编码同样没有被指定,但是7-bitASCII是最基本的通用编码。

java解析CSV文件的通用方法:

其它辅组类参考   http://www.cnblogs.com/wshsdlau/p/5643862.html

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import com.boguan.bte.service.common.IExcelRowReader;

/**
 * 名称: CsvParser.java<br>
 * 描述: <br>
 * 类型: JAVA<br>
 * 最近修改时间:2016年7月6日 上午10:22:34<br>
 *
 * @since 2016年7月6日
 * @author
 */
public class CsvReader {

    /**
     * Space mark , ; : etc.
     */
    private String spaceMark = ",";

    /**
     * CSV固定只有SHEET_NUM=0
     */
    private final static int SHEET_NUM = 0;

    /**
     * Contructor
     *
     * @param inputCsvFile
     */
    public CsvReader() {
    }

    /**
     * 行读取
     */
    private IExcelRowReader rowReader;

    public void setRowReader(IExcelRowReader rowReader) {
        this.rowReader = rowReader;
    }

    /**
     * 从CSV文件中获取数组
     *
     * @return
     * @throws IOException
     */
    public void process(String inputCsvFile) throws IOException {
        BufferedReader in = null;
        try {
            in = new BufferedReader(new FileReader(inputCsvFile));
            List<List<String>> retval = new ArrayList<List<String>>();
            String regExp = getRegExp();
            String strLine;
            String str = "";
            int rowNum = 0;
            List<String> listTemp = null;
            while ((strLine = in.readLine()) != null) {
                Pattern pattern = Pattern.compile(regExp);
                Matcher matcher = pattern.matcher(strLine);
                listTemp = new ArrayList<String>();
                while (matcher.find()) {
                    str = matcher.group();
                    str = str.trim();
                    if (str.endsWith(spaceMark)) {
                        str = str.substring(0, str.length() - 1);
                        str = str.trim();
                    }
                    if (str.startsWith("\"") && str.endsWith("\"")) {
                        str = str.substring(1, str.length() - 1);
                        if (CsvReader.isExisted("\"\"", str)) {
                            str = str.replaceAll("\"\"", "\"");
                        }
                    }
                    if (!"".equals(str)) {
                        listTemp.add(str);
                    }else{
                        listTemp.add(" ");
                    }
                }
                retval.add(listTemp);
                rowReader.getRows(SHEET_NUM, rowNum, listTemp);
                rowNum++;
            }
        } finally {
            if (in != null) {
                in.close();
            }
        }
    }

    /**
     * Regular Expression for CSV parse
     *
     * @return
     */
    private String getRegExp() {
        final String SPECIAL_CHAR_A = "[^\",\\n  ]";
        final String SPECIAL_CHAR_B = "[^\"" + spaceMark + "\\n]";

        StringBuffer strRegExps = new StringBuffer();
        strRegExps.append("\"((");
        strRegExps.append(SPECIAL_CHAR_A);
        strRegExps.append("*[" + spaceMark + "\\n  ])*(");
        strRegExps.append(SPECIAL_CHAR_A);
        strRegExps.append("*\"{2})*)*");
        strRegExps.append(SPECIAL_CHAR_A);
        strRegExps.append("*\"[  ]*" + spaceMark + "[  ]*");
        strRegExps.append("|");
        strRegExps.append(SPECIAL_CHAR_B);
        strRegExps.append("*[  ]*" + spaceMark + "[  ]*");
        strRegExps.append("|\"((");
        strRegExps.append(SPECIAL_CHAR_A);
        strRegExps.append("*[" + spaceMark + "\\n  ])*(");
        strRegExps.append(SPECIAL_CHAR_A);
        strRegExps.append("*\"{2})*)*");
        strRegExps.append(SPECIAL_CHAR_A);
        strRegExps.append("*\"[  ]*");
        strRegExps.append("|");
        strRegExps.append(SPECIAL_CHAR_B);
        strRegExps.append("*[  ]*");
        return strRegExps.toString();
    }

    /**
     * If argChar is exist in argStr
     *
     * @param argChar
     * @param argStr
     * @return
     */
    private static boolean isExisted(String argChar, String argStr) {

        boolean blnReturnValue = false;
        if ((argStr.indexOf(argChar) >= 0) && (argStr.indexOf(argChar) <= argStr.length())) {
            blnReturnValue = true;
        }
        return blnReturnValue;
    }

}
时间: 2024-09-30 19:51:42

CSV文件解析的相关文章

CSV文件解析到DataTable

详细代码如下: 1 public class CsvParsingHelper 2 { 3 /// <summary> 4 /// 将csv文件的数据转成datatable 5 /// </summary> 6 /// <param name="csvfilePath">csv文件路径</param> 7 /// <param name="firstIsRowHead">是否将第一行作为字段名</pa

Cocos数据篇[3.4](5) ——CSV文件解析

[唠叨] 在一个游戏中,通常会有很多怪物.关卡.技能等数据,这些数据不可能在代码里写死,一般都会使用配置文件保存,使用时再加载到内存. CSV文件编辑起来十分简单,所以常常用来配置游戏的数据信息. 本文要介绍的是:如何读取CSV文件格式的数据. [扩展阅读] http://baike.baidu.com/subview/468993/5926031.htm (CSV百度百科) http://blog.csdn.net/stevenkylelee/article/details/38309147 

EXCEL与CSV文件解析工具

package com.common.util; import java.io.BufferedReader; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.List; import java.util.regex.Matcher; import java.util.

iOS-解析读取CSV文件,解析excel文件

项目中可能会遇到数据库中导出CSV格式数据,类似于如下图: 需要将csv数据导入进程序中使用,或者写入本地数据库文件中. *什么是CSV? CSV,即逗号分隔值(Comma-Separated Values).有时也称为字符分隔值,因为分隔字符也可以不是逗号,可以是分号;),其文件以纯文本形式存储表格数据(数字和文本). 这种文件格式经常用来作为不同程序之间的数据交互的格式. CSV格式数据的结构类似表格,不同的记录占用一行,一行中的字段用","(逗号)分隔. 在xcode中, csv

解析 csv文件 java &gt;&gt;&gt;&gt;&gt;最爱那水货

1 /** 2 * csv文件解析 <br> 3 * wx 微信明细数据 第1行是标题 ,最后2行 是总结 提取数据需要过滤<br> 4 * zfb 支付宝明细数据 前4行 和最后4行是总结 第5行是 标题 提取数据时需要过滤 5 * @param localPath 本地文件绝对路径 6 * @param flag 支付机构 wx zfb pos 7 * @return 8 */ 9 public List<String[]> csvAnalysis(String l

自制工具:CSV代码生成器:自动生成CSV文件对应的C++实体类和字段类型解析代码

本文乃Siliphen原创,转载请注明出处:http://blog.csdn.net/stevenkylelee 更有开发效率地使用CSV文件 为了更有效率地使用CSV文件,我制作了一个工具:Code代码生成器. 这个工具可以对CSV文件进行简单地配置,自动生成这个CSV文件对应的C++数据结构和字段类型解析函数代码. 工程项目只要加入这些自动生成的代码,就可以更方便地使用来自CSV配置文件的数据. 用工具自动生代码,可以省去了手工编写.手工维护那些大量的.无聊繁琐的类型定义.数据转换的代码的过

练习:读取解析CSV文件,将读取结果输出的控制台上,并封装到4个Teacher对象中.

/** *    读取解析CSV文件,将读取结果输出的控制台上,并封装到4个Teacher对象中. *    1, 土鳖, 13101015338, 北京海淀区 2, 咪咪, 13201015338, 北京朝阳区 3, 小仓, 13601015818, 北京宣武区 4, 饭岛爱, 13201025818, 北京朝阳区 /** * 读取解析CSV文件,将读取结果输出的控制台上,并封装到4个Teacher对象中. * 1, 土鳖, 13101015338, 北京海淀区 2, 咪咪, 13201015

如何用Java解析CSV文件

首先看一下csv文件的规则: csv(Comma Separate Values)文件即逗号分隔符文件,它是一种文本文件,可以直接以文本打开,以逗号分隔.windows默认用excel打开.它的格式包括以下几点(它的格式最好就看excel是如何解析的.): ①每条记录占一行: ②以逗号为分隔符: ③逗号前后的空格会被忽略: ④字段中包含有逗号,该字段必须用双引号括起来: ⑤字段中包含有换行符,该字段必须用双引号括起来: ⑥字段前后包含有空格,该字段必须用双引号括起来: ⑦字段中的双引号用两个双引

Qt解析CSV文件

最近需要解析Excel文件,于是顺带写了解析CSV的代码 定义数据类型LX::Sheet 1 #ifndef LX_H 2 #define LX_H 3 4 #include <QString> 5 #include <QStringList> 6 7 namespace LX 8 { 9 class Sheet 10 { 11 enum FieldType{STRING, INT, DOUBLE, BOOL}; 12 public: 13 Sheet(){} 14 Sheet(S