tags:

views:

506

answers:

4

I have a csv file in the below format.

H,"TestItems_20100107.csv",07/01/2010,20:00:00,"TT1198","MOBb","AMD",NEW,,

I require the split command to ignore the commas inside the double quotes . So i used the below split command from an earlier post. Pasted the URL that i took this command

String items[] = line.split(",(?=([^\"]*\"[^\"]*\")*[^\"]*$)");
System.out.println("items.length"+items.length);

http://stackoverflow.com/questions/1757065/java-splitting-a-comma-separated-string-but-ignoring-commas-in-quotes/1757107

When i run for this CSV data I am getting the items.length printed as 8. The last two commas at the end of line after "NEW" are ignored. I want the split command to pick up these commas and return me the length as 10. It's not picking up the null commas if it's in end but it's picking it up if it's in the middle of string. Not sure what i need to modify in the split command to resolve this issue. Also in the csv file Double quotes within the contents of a Text field can be repeated (e.g. "This account is a ""large"" one")

+2  A: 

There's nothing wrong with the regular expression. The problem is that split discards empty matches at the end:

This method works as if by invoking the two-argument split method with the given expression and a limit argument of zero. Trailing empty strings are therefore not included in the resulting array.

A workaround is to supply an argument greater than the number of columns you expect in your CSV file:

 String[] tokens = line.split(",(?=([^\"]*\"[^\"]*\")*[^\"]*$)", 99);
Mark Byers
Actually, wouldn't it be better to specify -1 instead of 99? According to the docs, the difference between 0 and non-positive numbers is that with 0 "trailing empty strings will be discarded."
R. Bemrose
@R. Bemrose: I missed that bit, but if you're right then yes that sounds better.
Mark Byers
@mark @bemrose You guys are amazing! Thanks for the help though I almost cracked the reg exp :D
Sandeep
A: 

Thanks a lot. It's working now. Could you pls post some good web link for learning regex patterns. I saw some websites but were not good. Also I am new to stackoverflow. How do i assign points for you and close this post?

Arav
If his answer worked then mark it as the "accepted answer". There should be a tick icon below the up/down vote control. If you click the tick he will get the reputation for the accepted answer.
David
A: 

I don't see any tick icon beow the up/down vote control. I want to vote to close the question. But if i click it it's saying I require 15 reputations not sure how to close the question.

Arav
A: 

I am trying to get my CSV file to print parsed data to hopper 1 or hopper2 etc. What do I add to the file?

Linda
-1 Wrong question.
katrielalex