Java: CSVUtils

解析CSV文件,最简单,最直接,最突然的想法就是

 

"a,b,c,d".split(",")

 

但是如果复杂一点儿,加上一些特殊字符,比如引号“"”,逗号“,”,那你就会发现split(",")不灵光了。于是今天就闲着没事儿写了一个,没有完全测试,但是应该没问题,哈哈

package com.javaeye.terrencexu.csv

import java.util.LinkedList;
import java.util.List;

public final class CSVUtils {

	private CSVUtils() {}
	
	private static char fieldSep = ',';

	private static List<String> fields = null;

	/**
	 * This function will split the input on commas. It needs to decide whether
	 * to parse normally or consider special scenarios like "AA,BB". This
	 * function returns the number of fields present in the input.
	 * 
	 * @param line
	 * @return
	 */
	public static List<String> split(String line) {
		fields = new LinkedList<String>();
		
		if (line.length() == 0) {
			return null;
		}
		
		int curPos = 0;
		
		while(curPos <= line.length()) {
			if (curPos < line.length() && line.charAt(curPos) == '"') {
				curPos = parseQuoted(line, ++curPos);
			} else {
				curPos = parsePlain(line, curPos);
			}

			curPos ++;
		}

		return fields;
	}
	
	public static List<String> split(String line, char separator) {
		fieldSep = separator;
		
		return split(line);
	}

	/**
	 * This function will parse all fields that are not in quotes.
	 * 
	 * @param line
	 * @param curPos
	 * @return
	 */
	private static int parsePlain(String line, int curPos) {
		int nextSepPos;

		nextSepPos = line.indexOf(fieldSep, curPos);

		if (nextSepPos == -1) {
			fields.add(line.substring(curPos));
			return line.length();
		} else {
			fields.add(line.substring(curPos, nextSepPos));
		}
		
		return nextSepPos;
	}

	/**
	 * This function will parse all fields that are in quotes.
	 * 
	 * @param line
	 * @param curPos
	 * @return
	 */
	private static int parseQuoted(String line, int curPos) {
		int tmpPos;
		String fld = "";
		
		for (tmpPos = curPos; tmpPos < line.length(); tmpPos++) { 
			if (line.charAt(tmpPos) == '"' && tmpPos + 1 < line.length()) { 
				if (line.charAt(tmpPos + 1) == '"') { 
					tmpPos++; 
				} else if (line.charAt(tmpPos + 1) == fieldSep) { 
					tmpPos++;
					break;
				}
				
			} else if (line.charAt(tmpPos) == '"' && tmpPos + 1 == line.length()) {
				break;
			}
			
			fld = fld + line.charAt(tmpPos); 
		}
		
		fields.add(fld);
		
		return tmpPos;
	}

}

 

测试一把:

public static void main(String[] args) {
	String line = "col_1,Test,\"{\"\"key\"\":\"\"date\"\",\"\"order\"\":\"\"desc\"\"}\",,,,application/xml";
	String line2 = "a|b|\"|\"|d";
	
	System.out.println(CSVUtils.split(line));
	System.out.println(CSVUtils.split(line2, '|'));
}

 运行结果:

[col_1, Test, {"key":"date","order":"desc"}, , , , application/xml]

[a, b, |, d]

 

 -- Done --

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当然,我可以为您提供一个简单的 Java CSV 工具类的源码示例。以下是一个基本的实现,可以用于读取和写入 CSV 文件。 ```java import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.util.ArrayList; import java.util.List; public class CSVUtils { private static final char DEFAULT_SEPARATOR = ','; private static final char DEFAULT_QUOTE = '"'; public static List<String[]> readCSV(String csvFile) { List<String[]> lines = new ArrayList<>(); try (BufferedReader br = new BufferedReader(new FileReader(csvFile))) { String line; while ((line = br.readLine()) != null) { String[] values = parseLine(line); lines.add(values); } } catch (IOException e) { e.printStackTrace(); } return lines; } private static String[] parseLine(String line) { return parseLine(line, DEFAULT_SEPARATOR, DEFAULT_QUOTE); } private static String[] parseLine(String line, char separator, char quoteChar) { List<String> values = new ArrayList<>(); StringBuilder sb = new StringBuilder(); boolean inQuotes = false; for (char c : line.toCharArray()) { if (c == quoteChar) { inQuotes = !inQuotes; } else if (c == separator && !inQuotes) { values.add(sb.toString().trim()); sb.setLength(0); } else { sb.append(c); } } values.add(sb.toString().trim()); return values.toArray(new String[0]); } public static void writeCSV(String csvFile, List<String[]> lines) { try (BufferedWriter bw = new BufferedWriter(new FileWriter(csvFile))) { for (String[] values : lines) { String line = joinLine(values); bw.write(line); bw.newLine(); } } catch (IOException e) { e.printStackTrace(); } } private static String joinLine(String[] values) { return joinLine(values, DEFAULT_SEPARATOR, DEFAULT_QUOTE); } private static String joinLine(String[] values, char separator, char quoteChar) { StringBuilder sb = new StringBuilder(); for (int i = 0; i < values.length; i++) { if (i > 0) { sb.append(separator); } sb.append(quoteChar); sb.append(values[i]); sb.append(quoteChar); } return sb.toString(); } } ``` 这个工具类提供了两个主要方法: - `readCSV`:用于从指定的 CSV 文件中读取数据,并将每一行的值存储在一个 `List<String[]>` 中。 - `writeCSV`:用于将数据写入到指定的 CSV 文件中。 您可以根据需要修改这个工具类,以满足特定的 CSV 格式要求或增加更多功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值