`
zhangjim
  • 浏览: 52697 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

处理csv文件中引号里面逗号问题

 
阅读更多

我有一个csv的文件要处理,格式如下吧:
48674530,"Greentech Out, Limited",5200-000-04-13-1,"20/F, Euro Tntre, 21 eux Rd CentralHK","https://www.icris.cr.gov.hk/csci/cnc_comp.do"

最终要处理成:

48674530,

"Greentech Out, Limited"

5200-000-04-13-1

"20/F, Euro Tntre, 21 eux Rd CentralHK"

"https://www.icris.cr.gov.hk/csci/cnc_comp.do"

 

public class Test {
	public static void main(String[] args) throws ParseException, Exception {
		BufferedReader reader = new BufferedReader(new FileReader(new File("D:\\My Files\\Desktop\\bug#9236\\test1.csv")));
		while(reader.read() != -1){
			String line = reader.readLine();
			String[] result = line.split(",(?=([^\"]*\"[^\"]*\")*[^\"]*$)");
		    for (String str : result) {
		        System.out.println(str);
		    }
		    /*
			List list = parseLine(line, true);
			for(int i = 0; i < list.size(); i++){
				System.out.println(list.get(i));
			}
		     */
		}
	}
	
	private static List parseLine(String src, boolean isNeedTrim) throws IOException {
		List line = new LinkedList();
		src = src.trim();
		if (src.length() == 0)
			return line;

		StringBuffer stringbuffer = new StringBuffer();
		boolean beginWithQuote = false;
		for (int i = 0; i < src.length(); i++) {
			char ch = src.charAt(i);
			if (ch == '\"') {
				if (beginWithQuote) {
					i++;
					if (i >= src.length()) {
						if (isNeedTrim)
							line.add(stringbuffer.toString().trim());
						else
							line.add(stringbuffer.toString());
						stringbuffer = new StringBuffer();
					} else {
						ch = src.charAt(i);
						if (ch == '\"') {
							stringbuffer.append(ch);
						} else if (ch == ',') {
							if (isNeedTrim)
								line.add(stringbuffer.toString().trim());
							else
								line.add(stringbuffer.toString());
							stringbuffer = new StringBuffer();
							beginWithQuote = false;
						} else {
							for (int k = i; k < src.length(); k++) {
								ch = src.charAt(k);
								if (ch == ',') {
									break;
								} else {
									stringbuffer.append(ch);
									i++;
								}
							}
							if (isNeedTrim)
								line.add(stringbuffer.toString().trim());
							else
								line.add(stringbuffer.toString());
							stringbuffer = new StringBuffer();
							beginWithQuote = false;
							continue;
						}
					}
				} else if (stringbuffer.length() == 0) {
					beginWithQuote = true;
				} else {
					for (int k = i; k < src.length(); k++) {
						ch = src.charAt(k);
						if (ch == ',') {
							break;
						} else {
							stringbuffer.append(ch);
							i++;
						}
					}
					if (isNeedTrim)
						line.add(stringbuffer.toString().trim());
					else
						line.add(stringbuffer.toString());
					stringbuffer = new StringBuffer();
					beginWithQuote = false;	
					continue;
				}
			} else if (ch == ',') {
				if (beginWithQuote) {
					stringbuffer.append(ch);
				} else {
					if (isNeedTrim)
						line.add(stringbuffer.toString().trim());
					else
						line.add(stringbuffer.toString());
					stringbuffer = new StringBuffer();
					beginWithQuote = false;
				}
			} else {
				stringbuffer.append(ch);
			}
		}
		if (stringbuffer.length() != 0) {
			{
				if (isNeedTrim)
					line.add(stringbuffer.toString().trim());
				else
					line.add(stringbuffer.toString());
			}
		}
		return line;
	}
}

 

public class CSVParser {

	private static Pattern LINE_PATTERN = Pattern.compile("(\"[^\"]*(\"{2})*[^\"]*\")*[^,]*,");

	public static String[] parseLine(String line) {
		return parseLine(line, true);
	}

	public static String[] parseLine(String line, boolean trimEmptyCell) {

		String[] retVal = null;
		if ((line != null) && (line.length() > 0)) {
			String str;
			ArrayList cells = new ArrayList();

			Matcher mCells = LINE_PATTERN.matcher(line + ",");
			while (mCells.find()) {
				str = mCells.group();
				str = str.replaceAll("(?sm)\"?([^\"]*(\"{2}[^\"]*)*[^\"]*)\"?.*,", "$1");
				str = str.replaceAll("(?sm)(\"(\"))", "$2");
				cells.add(str);
			}

			boolean allEmpty = true;

			retVal = (String[]) cells.toArray(new String[0]);
			for (int i = 0; i < retVal.length; i++) {
				if (trimEmptyCell)
					retVal[i] = retVal[i].trim();
				if (retVal[i].length() > 0)
					allEmpty = false;
			}

			if (allEmpty)
				retVal = null;
		}
		return retVal;
	}

}

 

 

 

 

 

分享到:
评论

相关推荐

    java分割读取csv文件内容可根据逗号引号来切割读取

    可读取复杂的csv文件,根据引号和逗号等分割读取所需要的数据信息。

    C语言读取CSV文件

    此外,如果CSV文件中存在包含逗号的字段(如逗号引号包围的文本),则需要更复杂的解析逻辑,可能需要用到正则表达式库或第三方CSV解析库。 在提供的`ReadCSVFile`源码中,作者可能已经封装了这些功能,包括对复杂...

    csv文件中,解决数字列转换成文本列

    在日常的数据处理工作中,CSV(逗号分隔值)文件是一种非常常见的数据存储格式。它简单易用,可以方便地在不同的系统之间进行数据交换。然而,在处理CSV文件时,可能会遇到这样的需求:将某些数字列转换为文本形式,...

    VC++读写CSV文件的例子

    此外,还可以处理包含逗号、引号等复杂情况的CSV文件,例如使用双引号包裹含有逗号的字段。 对于压缩包子文件"WWW.WEI2008.COM",可能包含了实现这些功能的源代码或示例。解压后,查看源码可以更深入理解CSV文件...

    Java 操作CSV文件类

    CSV是一种结构化的文本文件,可以看做是二维表,构成规则如下:每一行(“\r\n”标志行结束)对应表格的一行,不同列之间使用逗号分隔;如果列内容中包含逗号,则使用双引号将整列包裹起来;如果列内容中包含双引号,...

    C++对文件排序并输出CSV文件

    在C++编程中,对文件中的数据进行排序并...总之,本项目展示了C++处理文件排序和CSV文件的基本技术,结合了文件I/O、排序算法和自定义比较函数等核心概念。理解并掌握这些知识点对于任何C++开发者来说都是至关重要的。

    基于LabVIEW的CSV格式文件的写入

    在LabVIEW中,我们可以通过编程实现对CSV文件的创建和写入,以便于后续的数据分析和处理。 首先,我们需要了解LabVIEW中的文件I/O(输入/输出)函数。在LabVIEW的函数选板中,通常可以在“字符串”类别下找到与文件...

    csv文件解析小工具 可直接运行

    在这个解析器中,正则表达式被用来高效准确地识别和处理CSV文件中的这些复杂结构。 正则表达式可能包括以下关键部分: - `\s*`: 匹配零个或多个空白字符,用于处理前导或尾随空格。 - `,`: 直接匹配逗号,作为默认...

    CH376S读CSV文件_ch376s_c_读写csv文件_

    在嵌入式系统开发中,有时我们需要处理存储在CSV(Comma Separated Values)文件中的数据,例如在STM32F103RCT6这样的微控制器上。CH376S是一款USB接口芯片,用于扩展微控制器的文件系统功能,包括读写SD卡或U盘上的...

    CSV文件格式解析器

    在CSV解析器中,FSM可以帮助我们识别和处理文件中的不同部分,如字段、记录和分隔符。 以下是这个CSV文件解析器的一些关键知识点: 1. 文件读取:使用C++的`fstream`库来读取和处理CSV文件。`ifstream`对象用于...

    linux c++csv文件读写

    - 在读写文件时,确保正确处理文件打开失败、内存不足和其他可能的错误。 - 当读取CSV文件时,如果字段包含逗号或引号,应考虑使用`libcsv`等库,它们能够正确处理这些复杂情况。 - 写入CSV时,注意在必要时对字段...

    VC++6.0编译通过的读写CSV文件的代码及实例

    在VC++6.0中,我们可以使用标准库中的`fstream`类来处理文件操作,包括读取和写入CSV文件。`ifstream`用于读取,`ofstream`用于写入。下面是一些基本的API使用方法: 1. **打开文件**:使用`ifstream`或`ofstream`...

    CSV文件上传下载分隔符问题以及ABAP正则式

    在处理CSV文件时,经常会遇到分隔符问题,因为不同系统或应用可能使用不同的分隔符,如逗号、分号、制表符等。本主题将探讨CSV文件在上传下载过程中可能遇到的分隔符问题以及如何使用ABAP(Advanced Business ...

    C#读取csv格式文件的方法

    本文实例讲述了C#读取csv格式文件的方法。分享给大家供大家参考。具体实现方法如下: ...7 文件读写时引号,逗号操作规则互逆。 8 内码格式不限,可为 ASCII、Unicode 或者其他。 9 不支持特殊字符   二、C#读取

    读CSV文件小实例

    在VB.NET 2003环境下处理CSV文件,尤其是对于非英文环境如日文系统,需要注意一些特定的问题。以下是一些关于读取CSV文件的关键知识点: 1. **CSV文件结构**:CSV文件以其简单的结构著称,每行数据由逗号分隔的字段...

    Csv文件快速转Excel文件 C#

    它提供了简单易用的API,使得在C#项目中处理CSV文件变得轻松。在NuGet包管理器中,可以搜索并安装"OpenCSV"库,将其添加到你的项目中。 转换过程分为几个步骤: 1. **读取CSV文件**:使用OpenCSV的`CsvReader`类,...

    c++实现的读写csv文件

    在IT行业中,CSV(Comma Separated Values)文件是一种广泛使用的数据存储格式,因其简单、通用而被众多程序和应用程序支持...通过封装这些操作,我们可以创建方便易用的类,使得在C++项目中处理CSV数据变得更加简单。

    Qt qtablewidget与CSV文件的关系

    Qt提供了QTextStream和QFile类来处理文件操作。通过打开CSV文件,逐行读取并解析数据,然后将这些数据插入到QTableWidget的对应单元格中。解析CSV时,通常依据逗号分隔符将一行数据拆分为多个元素。注意,对于包含...

    对CSV文件操作方法

    虽然可以使用基本的文件操作函数处理CSV,但一些库如`libcsv`或`csv-parser-cpp`提供了更高级的功能,如自动处理逗号、引号内的分隔符,以及更易于使用的API。 5. **错误处理**: 在处理CSV文件时,一定要检查...

    java读写csv文件

    CSV 文件可以包含各种特殊字符的处理信息,如对包含特殊字符的字符串数据首尾加双引号,对数据中的单个双引号前加单个双引号等。 使用 Java 读写 CSV 文件可以使用 Java IO 类库,但是在实际处理中发现 CSV 文件...

Global site tag (gtag.js) - Google Analytics