001 package com.croftsoft.apps.tab2xml;
002
003 import java.io.*;
004 import java.util.*;
005
006 /*********************************************************************
007 * Converts a comma separated value (CSV) file to XML.
008 *
009 * @version
010 * 2003-05-12
011 * @since
012 * 2003-05-12
013 * @author
014 * <a href="https://www.croftsoft.com/">David Wallace Croft</a>
015 *********************************************************************/
016
017 public final class Csv2Xml
018 //////////////////////////////////////////////////////////////////////
019 //////////////////////////////////////////////////////////////////////
020 {
021
022 private static final String [ ] EMPTY_STRING_ARRAY
023 = new String [ 0 ];
024
025 //////////////////////////////////////////////////////////////////////
026 //////////////////////////////////////////////////////////////////////
027
028 public static void main ( String [ ] args )
029 throws Exception
030 //////////////////////////////////////////////////////////////////////
031 {
032 convert ( args [ 0 ], args [ 1 ] );
033 }
034
035 public static void convert (
036 String inputCsvFilename,
037 String outputXmlFilename )
038 throws Exception
039 //////////////////////////////////////////////////////////////////////
040 {
041 FileReader fileReader = new FileReader ( inputCsvFilename );
042
043 BufferedReader bufferedReader = new BufferedReader ( fileReader );
044
045 String line = bufferedReader.readLine ( );
046
047 String [ ] columnHeaders = parseLine ( line );
048
049 int columnCount = columnHeaders.length;
050
051 PrintWriter printWriter = new PrintWriter (
052 new BufferedWriter ( new FileWriter ( outputXmlFilename ) ) );
053
054 printWriter.println ( "<data>" );
055
056 while ( ( line = bufferedReader.readLine ( ) ) != null )
057 {
058 int columnIndex = 0;
059
060 String [ ] values = parseLine ( line );
061
062 printWriter.println ( " <record>" );
063
064 for ( int i = 0; i < columnCount; i++ )
065 {
066 if ( values [ i ] != null )
067 {
068 printWriter.println (
069 " <" + columnHeaders [ i ] + ">"
070 + values [ i ]
071 + "</" + columnHeaders [ i ] + ">" );
072 }
073 }
074
075 printWriter.println ( " </record>" );
076 }
077
078 printWriter.println ( "</data>" );
079
080 printWriter.flush ( );
081
082 printWriter.close ( );
083 }
084
085 public static String [ ] parseLine ( String line )
086 //////////////////////////////////////////////////////////////////////
087 {
088 List stringList = new ArrayList ( );
089
090 StringTokenizer stringTokenizer
091 = new StringTokenizer ( line, ",\"", true );
092
093 boolean inQuotes = false;
094
095 boolean stringStarted = false;
096
097 StringBuffer stringBuffer = new StringBuffer ( );
098
099 while ( stringTokenizer.hasMoreTokens ( ) )
100 {
101 String token = stringTokenizer.nextToken ( );
102
103 if ( token.equals ( "\"" ) )
104 {
105 if ( inQuotes )
106 {
107 inQuotes = false;
108
109 stringList.add ( stringBuffer.toString ( ) );
110
111 stringBuffer = new StringBuffer ( );
112
113 stringStarted = false;
114 }
115 else
116 {
117 inQuotes = true;
118
119 stringStarted = true;
120
121 stringBuffer = new StringBuffer ( );
122 }
123 }
124 else if ( token.equals ( "," ) )
125 {
126 if ( inQuotes )
127 {
128 stringBuffer.append ( "," );
129 }
130 else
131 {
132 if ( stringStarted )
133 {
134 stringList.add ( stringBuffer.toString ( ) );
135
136 stringBuffer = new StringBuffer ( );
137 }
138
139 stringStarted = true;
140 }
141 }
142 else
143 {
144 if ( !stringStarted )
145 {
146 stringStarted = true;
147
148 stringBuffer = new StringBuffer ( );
149 }
150
151 stringBuffer.append ( token );
152 }
153 }
154
155 if ( stringStarted )
156 {
157 stringList.add ( stringBuffer.toString ( ) );
158 }
159
160 return ( String [ ] ) stringList.toArray ( EMPTY_STRING_ARRAY );
161 }
162
163 //////////////////////////////////////////////////////////////////////
164 //////////////////////////////////////////////////////////////////////
165
166 private Csv2Xml ( ) { }
167
168 //////////////////////////////////////////////////////////////////////
169 //////////////////////////////////////////////////////////////////////
170 }