栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

java读取csv

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

java读取csv

java读取csv,处理特殊字符(引号 逗号 斜杠 等)。注意,wps和office对于/"、, 的处理不同。

感谢群友大小姐、黑猫的指导

附大小姐的git:https://github.com/yingyulou/Published-Articles

此算法原理是"手工编码的确定性有穷自动机"算法,有兴趣的可以学习下

import java.util.ArrayList;
import java.util.List;


public class CsvFileParseUtil {
    
    private enum LexerStage {
        
        Start,
        
        Common,
        
        Quote,
        
        DoubleQuote,
    }

    private static class Parser {
        StringBuilder splitStr = new StringBuilder();
        LexerStage lexerStage;
        //返回的分割后的数组
        List splitList = new ArrayList();
        //分隔符
        String delim = ",";

        public Parser(String delim) {
            this.lexerStage = LexerStage.Start;
            this.delim = delim;
        }
    }

    private static void parseCsvLineCommonHelper(Parser parser, char curChar) {
        if (parser.delim.equals(curChar + "")) {
            parser.lexerStage = LexerStage.Start;
            parser.splitList.add(parser.splitStr.toString());
            parser.splitStr.setLength(0);
        } else {
            parser.splitStr.append(curChar);
        }
    }

    private static void parseCsvLineStartHelper(Parser parser, char curChar) {
        switch (curChar) {
            case '"':
                parser.lexerStage = LexerStage.Quote;
                break;
            default:
                parser.lexerStage = LexerStage.Common;
                parseCsvLineCommonHelper(parser, curChar);
                break;
        }
    }

    private static void parseCsvLineQuoteHelper(Parser parser, char curChar) {
        switch (curChar) {
            case '"':
                parser.lexerStage = LexerStage.DoubleQuote;
                break;
            default:
                parser.splitStr.append(curChar);
                break;
        }
    }

    private static void parseCsvLineDoubleQuoteHelper(Parser parser, char curChar) {
        switch (curChar) {
            case '"':
                parser.lexerStage = LexerStage.Quote;
                parser.splitStr.append('"');
                break;
            default:
                parser.lexerStage = LexerStage.Common;
                parseCsvLineCommonHelper(parser, curChar);
        }
    }

    public static List parseCsvLine(String csvLineStr, String delim) throws Exception {
        Parser parser = new Parser(delim);

        for (char curChar : csvLineStr.toCharArray()) {
            switch (parser.lexerStage) {
                case Start:
                    parseCsvLineStartHelper(parser, curChar);
                    break;
                case Common:
                    parseCsvLineCommonHelper(parser, curChar);
                    break;
                case Quote:
                    parseCsvLineQuoteHelper(parser, curChar);
                    break;
                case DoubleQuote:
                    parseCsvLineDoubleQuoteHelper(parser, curChar);
                    break;
                default:
                    throw new Exception("Invalid LexerStage value");
            }
        }

        parser.splitList.add(parser.splitStr.toString());

        return parser.splitList;
    }

    public static void main(String[] args) throws Exception {
        parseCsvLine((""4|",|"),",").
                stream().
                forEach(a -> System.out.println(a));
    }

}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/424998.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号