`
qtlkw
  • 浏览: 309656 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Java读取CSV的常用方法

    博客分类:
  • JAVA
 
阅读更多
[url]http://blog.csdn.net/hantiannan/article/details/6756347   [/url]
package com.han.csv.util;  
      
    import java.io.BufferedReader;  
    import java.io.FileInputStream;  
    import java.io.InputStreamReader;  
    import java.util.ArrayList;  
      
    public class CSVFileUtil {  
        // CSV文件编码  
        public static final String ENCODE = "UTF-8";  
      
        private FileInputStream fis = null;  
        private InputStreamReader isw = null;  
        private BufferedReader br = null;  
      
         
        public CSVFileUtil(String filename) throws Exception {  
            fis = new FileInputStream(filename);  
            isw = new InputStreamReader(fis, ENCODE);  
            br = new BufferedReader(isw);  
        }  
      
        // ==========以下是公开方法=============================  
        /** 
         * 从CSV文件流中读取一个CSV行。 
         * 
         * @throws Exception 
         */  
        public String readLine() throws Exception {  
      
            StringBuffer readLine = new StringBuffer();  
            boolean bReadNext = true;  
      
            while (bReadNext) {  
                //  
                if (readLine.length() > 0) {  
                    readLine.append("\r\n");  
                }  
                // 一行  
                String strReadLine = br.readLine();  
      
                // readLine is Null  
                if (strReadLine == null) {  
                    return null;  
                }  
                readLine.append(strReadLine);  
      
                // 如果双引号是奇数的时候继续读取。考虑有换行的是情况。  
                if (countChar(readLine.toString(), '"', 0) % 2 == 1) {  
                    bReadNext = true;  
                } else {  
                    bReadNext = false;  
                }  
            }  
            return readLine.toString();  
        }  
      
        /** 
         *把CSV文件的一行转换成字符串数组。指定数组长度,不够长度的部分设置为null。 
         */  
        public static String[] fromCSVLine(String source, int size) {  
            ArrayList tmpArray = fromCSVLinetoArray(source);  
            if (size < tmpArray.size()) {  
                size = tmpArray.size();  
            }  
            String[] rtnArray = new String[size];  
            tmpArray.toArray(rtnArray);  
            return rtnArray;  
        }  
      
        /** 
         * 把CSV文件的一行转换成字符串数组。不指定数组长度。 
         */  
        public static ArrayList fromCSVLinetoArray(String source) {  
            if (source == null || source.length() == 0) {  
                return new ArrayList();  
            }  
            int currentPosition = 0;  
            int maxPosition = source.length();  
            int nextComma = 0;  
            ArrayList rtnArray = new ArrayList();  
            while (currentPosition < maxPosition) {  
                nextComma = nextComma(source, currentPosition);  
                rtnArray.add(nextToken(source, currentPosition, nextComma));  
                currentPosition = nextComma + 1;  
                if (currentPosition == maxPosition) {  
                    rtnArray.add("");  
                }  
            }  
            return rtnArray;  
        }  
      
      
        /** 
         * 把字符串类型的数组转换成一个CSV行。(输出CSV文件的时候用) 
         */  
        public static String toCSVLine(String[] strArray) {  
            if (strArray == null) {  
                return "";  
            }  
            StringBuffer cvsLine = new StringBuffer();  
            for (int idx = 0; idx < strArray.length; idx++) {  
                String item = addQuote(strArray[idx]);  
                cvsLine.append(item);  
                if (strArray.length - 1 != idx) {  
                    cvsLine.append(',');  
                }  
            }  
            return cvsLine.toString();  
        }  
      
        /** 
         * 字符串类型的List转换成一个CSV行。(输出CSV文件的时候用) 
         */  
        public static String toCSVLine(ArrayList strArrList) {  
            if (strArrList == null) {  
                return "";  
            }  
            String[] strArray = new String[strArrList.size()];  
            for (int idx = 0; idx < strArrList.size(); idx++) {  
                strArray[idx] = (String) strArrList.get(idx);  
            }  
            return toCSVLine(strArray);  
        }  
      
        // ==========以下是内部使用的方法=============================  
        /** 
         *计算指定文字的个数。 
         * 
         * @param str 文字列 
         * @param c 文字 
         * @param start  开始位置 
         * @return 个数 
         */  
        private int countChar(String str, char c, int start) {  
            int i = 0;  
            int index = str.indexOf(c, start);  
            return index == -1 ? i : countChar(str, c, index + 1) + 1;  
        }  
      
        /** 
         * 查询下一个逗号的位置。 
         * 
         * @param source 文字列 
         * @param st  检索开始位置 
         * @return 下一个逗号的位置。 
         */  
        private static int nextComma(String source, int st) {  
            int maxPosition = source.length();  
            boolean inquote = false;  
            while (st < maxPosition) {  
                char ch = source.charAt(st);  
                if (!inquote && ch == ',') {  
                    break;  
                } else if ('"' == ch) {  
                    inquote = !inquote;  
                }  
                st++;  
            }  
            return st;  
        }  
      
        /** 
         * 取得下一个字符串 
         */  
        private static String nextToken(String source, int st, int nextComma) {  
            StringBuffer strb = new StringBuffer();  
            int next = st;  
            while (next < nextComma) {  
                char ch = source.charAt(next++);  
                if (ch == '"') {  
                    if ((st + 1 < next && next < nextComma) && (source.charAt(next) == '"')) {  
                        strb.append(ch);  
                        next++;  
                    }  
                } else {  
                    strb.append(ch);  
                }  
            }  
            return strb.toString();  
        }  
      
        /** 
         * 在字符串的外侧加双引号。如果该字符串的内部有双引号的话,把"转换成""。 
         * 
         * @param item  字符串 
         * @return 处理过的字符串 
         */  
        private static String addQuote(String item) {  
            if (item == null || item.length() == 0) {  
                return "\"\"";  
            }  
            StringBuffer sb = new StringBuffer();  
            sb.append('"');  
            for (int idx = 0; idx < item.length(); idx++) {  
                char ch = item.charAt(idx);  
                if ('"' == ch) {  
                    sb.append("\"\"");  
                } else {  
                    sb.append(ch);  
                }  
            }  
            sb.append('"');  
            return sb.toString();  
        }  
    } 
分享到:
评论

相关推荐

    java读写csv文件,中文乱码问题

    2. **Java读取CSV文件**: - 使用`BufferedReader`和`InputStreamReader`组合,可以指定字符编码读取文件。例如: ```java FileInputStream fis = new FileInputStream("path_to_file.csv"); InputStreamReader ...

    Java CSV文件读取

    Java读取excel,Excel是我们平时工作中比较常用的用于存储二维表数据的,JAVA也可以直接对Excel进行操作。

    java读写csv文件

    Java 读写 CSV 文件是指使用 Java 语言来读取和写入 CSV 文件,CSV 文件是一种常用的数据文件格式,逗号分隔的文本文件,默认可以用 Office 软件打开。CSV 文件可以包含各种特殊字符的处理信息,如对包含特殊字符的...

    java 解析csv文件例子,csv文件 中文乱码问题

    首先,我们需要了解如何使用Java的标准库`java.io`和`java.nio`来读取CSV文件。最常用的是使用`BufferedReader`配合`Scanner`或者`Files.lines()`方法。例如: ```java import java.io.BufferedReader; import java...

    java读取excel poi 方法

    ### Java读取Excel POI方法详解 #### 一、POI简介及背景 Apache POI 是一个用于处理 Microsoft Office 格式文件的开源库,它提供了读取、写入和修改这些文件的功能。POI 项目中最常用的部分是 HSSF 和 XSSF,分别...

    JAVA导入CSV文件

    首先,我们来讨论如何在Java中读取CSV文件。最常用的库是Apache Commons CSV和OpenCSV。这两个库都提供了方便的API来处理CSV数据。 1. Apache Commons CSV: - 引入依赖:在Maven项目中,可以在pom.xml文件中添加...

    java文本读取方法

    本文介绍了Java中常用的四种文本文件读取方法:按字节读取、按字符读取、按行读取以及随机读取。每种方法都有其适用场景和特点,开发者可以根据实际需求选择合适的方式来处理文本文件。此外,还特别注意了异常处理和...

    java导入csv到sqlserver数据库的简单实现

    在Java中,我们可以使用Apache Commons CSV库来读取CSV文件。该库提供了CSVRecord类,用于表示CSV文件的一行记录,以及CSVParser和CSVReader类,用于解析和读取CSV文件。首先,确保在项目中引入Apache Commons CSV库...

    java操作csv

    2. **读取CSV**:创建`CSVParser`实例,指定分隔符和编码,然后遍历`CSVRecord`对象。 ```java Reader reader = Files.newBufferedReader(Paths.get("path_to_your_file.csv")); CSVFormat csvFormat = CSVFormat...

    读取和存储数据

    - 文本文件:在描述中提到的“文本文档里的数据”,通常指的是一种非二进制格式,如.txt或.csv,可以使用逐行读取或一次性读取所有内容的方法。 - 坐标数据:可能是指地理信息系统(GIS)中的坐标,如经纬度,可以...

    CSV文件格式读写代码

    #### 二、Java读取CSV文件方法 在Java中读取CSV文件主要涉及以下几个步骤: 1. **创建文件路径**:通过`java.io.File`类或字符串形式指定文件路径。 2. **读取文件**:可以使用`java.io.BufferedReader`、`...

    使用opencsv文件读写CSV文件

    readAll() 方法读取整个 CSV 文件,返回一个 List[]&gt; 对象,每个元素是一个字符串数组,表示一行数据。readNext() 方法读取下一行数据,返回一个字符串数组。 例如,下面是一个使用 Opencsv 读取 CSV 文件的示例...

    java常用编码code 根据ID或者code 获取name 省市区 area.csv

    一种常见的方式是使用Java标准库中的FileReader和BufferedReader类读取csv文件的每一行,然后使用字符串分割方法(如String.split())来分割每一行的数据,并将其存储到合适的数据结构中,比如HashMap。在这种情况下...

    easypoi导出工具

    easypoi常用导入,导出,工具,引入easypoi包ExcelUtil工具类,可以直接导出查询的数据

    java程序 删除半年前的文件 后缀名为csv

    3. **文件过滤**:为了只删除CSV文件,程序可能会使用`FilenameFilter`接口或Java 7引入的`Files`类的`walkFileTree`方法配合`FileVisitOption`,在遍历过程中只处理`.csv`后缀的文件。 4. **日期和时间处理**:...

    CSV导出.zip

    - 读取CSV文件:使用`BufferedReader`类读取文件,根据逗号分割每一行的数据,将其解析为数组或列表。 - 处理复杂情况:对于包含逗号、换行符或双引号的字段,需要正确处理转义规则,确保数据的正确解析。 3. ...

    Java读取文档时可能会用到的jar包

    以下是一些Java中读取文档时常用的jar包及其用途的详细说明: 1. **Apache POI** - 这个库主要用于处理Microsoft Office格式的文件,如Word(.doc, .docx)、Excel(.xls, .xlsx)和PowerPoint(.ppt, .pptx)。...

    Java读取Excel

    总之,Java读取Excel文件的方法多样,具体选择取决于项目需求和性能考虑。Apache POI是最常用的库,功能强大但可能会消耗较多内存;对于轻量级的需求,JExcelApi和OpenXLSX也是不错的选择。在实际开发中,要根据具体...

    ReadWrite_CSV_Java_example.zip_On Writing

    3. 使用BufferedReader读取CSV:首先,我们需要创建一个`FileReader`对象,然后通过它创建一个`BufferedReader`对象。使用`BufferedReader`的`readLine()`方法可以逐行读取文件内容。每行内容都是一个字符串,需要...

Global site tag (gtag.js) - Google Analytics