我有一个包含引用,名称,地址,金额,dateTo,dateFrom和必填列的文本文件,格式如下:
"120030125 J Blog 23, SOME HOUSE, 259.44 21-OCT-2013 17-NOV-2013"
" SQUARE, STREET, LEICESTER,"
LE1 2BB
"120030318 R Mxx 37, WOOD CLOSE, BIRMINGHAM, 121.96 16-OCT-2013 17-NOV-2013 Y"
" STREET, NN18 8DF"
"120012174 JE xx 25, SOME HOUSE, QUEENS 259.44 21-OCT-2013 17-NOV-2013"
" SQUARE, STREET, LEICESTER,"
LE1 2BB
"100154992 DL x 23, SOME HOUSE, QUEENS 270.44 21-OCT-2013 17-NOV-2013 Y"
" SQUARE, STREET, LEICESTER,"
LE1 2BC
我只对每个字符串的第一行感兴趣,并且想要在reference,name,amount,dateTo和dateFrom列中提取数据,并希望将它们写入CSV文件。目前我只能编写以下代码并提取第一行并删除起始和结束双引号。输入文件包含空格,输出文件也是如此。
public class ReadTxt {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new FileReader("C:/Users/me/Desktop/input.txt"));
String pattern = "\"\\d\\d\\d\\d";
// Create a Pattern object
Pattern r = Pattern.compile(pattern);
int i;
ArrayList<String> list = new ArrayList<String>();
boolean a = true;
PrintWriter out = new PrintWriter(new PrintWriter("C:/Users/me/Desktop/Output.txt"), a);
try {
String line = br.readLine();
while (line != null) {
Matcher m = r.matcher(line);
if (m.find()) {
String temp;
temp = line.substring(1, line.length() - 1);
list.add(temp);
}
else {
// do nothing
}
line = br.readLine();
}
}
finally {
br.close();
}
for (i = 0; i < list.size(); i++) {
out.println(list.get(i));
}
out.flush();
out.close();
}
}
上面的代码将创建一个带有以下输出的文本文件:
120030125 J Blog 23, SOME HOUSE, QUEENS 259.44 21-OCT-2013 17-NOV-2013
120030318 R Mxx 37, WOOD CLOSE, BIRMINGHAM, 121.96 16-OCT-2013 17-NOV-2013 Y
120012174 JE xx 25, SOME HOUSE, QUEENS 259.44 21-OCT-2013 17-NOV-2013
100154992 DL x 23, SOME HOUSE, QUEENS 259.44 21-OCT-2013 17-NOV-2013 Y
我的预期输出如下,但是进入csv文件:
120030125 J Blog 259.44 21-OCT-2013 17-NOV-2013
120030318 R Mxx 121.96 16-OCT-2013 17-NOV-2013
120012174 JE xx 259.44 21-OCT-2013 17-NOV-2013
100154992 DL x 259.44 21-OCT-2013 17-NOV-2013
由于我不是Java方面的专家,因此非常感谢任何建议,教程或帮助的链接。我确实尝试在互联网上查找教程,但在我的情况下找不到任何有用的教程。
答案 0 :(得分:1)
在这里,测试一下。我只使用了一个数组,但你可以在你的代码中实现必要的代码。我更改了一些地址(查看数组中的第二个和第三个地址),以便在不同的位置有空格和空格来进行测试。
public class SplitData {
public static void main(String[] args) {
String[] array = {"120030125 J Blog 23, SOME HOUSE, QUEENS 259.44 21-OCT-2013 17-NOV-2013",
"120030318 R Mxx 37,WOODCLOSE,BIRMINGHAM, 121.96 16-OCT-2013 17-NOV-2013 Y 0",
"120012174 JE xx 25, SOME HOUSE,QUEENS 259.44 21-OCT-2013 17-NOV-2013",
"100154992 DL x 23, SOME HOUSE, QUEENS 259.44 21-OCT-2013 17-NOV-2013 Y"
};
String s1 = null;
String s2 = null;
String s3 = null;
String s4 = null;
String s5 = null;
for (String s : array) {
String[] split = s.split("\\s+");
s1 = split[0];
s2 = split[1] + " " + split[2];
for (String string: split) {
if (string.matches("\\d+\\.\\d{2}")) {
s3 = string;
break;
}
}
String[] newArray = s.substring(s.indexOf(s3)).split("\\s+");
s4 = newArray[1];
s5 = newArray[2];
System.out.printf("%s\t%s\t%s\t%s\t%s\n", s1, s2, s3, s4, s5);
}
}
}
输出
120030125 J Blog 259.44 21-OCT-2013 17-NOV-2013
120030318 R Mxx 121.96 16-OCT-2013 17-NOV-2013
120012174 JE xx 259.44 21-OCT-2013 17-NOV-2013
100154992 DL x 259.44 21-OCT-2013 17-NOV-2013
答案 1 :(得分:1)
public static void main (String[] args) throws IOException {
BufferedReader br = new BufferedReader (new FileReader ("D:/input.txt"));
String pattern = "\"\\d\\d\\d\\d";
// Create a Pattern object
Pattern r = Pattern.compile (pattern);
int i;
ArrayList<String> list = new ArrayList<String> ();
boolean a = true;
PrintWriter out = new PrintWriter (new PrintWriter ("D:/Output.csv"), a);
try {
String line = br.readLine ();
line= line.trim ();
while (line != null) {
Matcher m = r.matcher (line);
if (m.find ()) {
String temp;
temp = line.substring (0, 19) + " "
+ line.substring (51, line.length () - 1);
temp = temp.replaceAll ("[ ]+", " ").replace ("\"", "");
String[] array = temp.split ("[ ]");
temp = array[0] +","+ array[1] +" "+ array[2]+","+ array[3]+","+ array[4]+","+ array[5];
list.add (temp);
} else {
// do nothing
}
line = br.readLine ();
}
} finally {
br.close ();
}
for (i = 0; i < list.size (); i++) {
out.println (list.get (i));
}
out.flush ();
out.close ();
}
<强>输出强>
120030125,J Blog,259.44,21-OCT-2013,17-NOV-2013
120030318,R Mxx,121.96,16-OCT-2013,17-NOV-2013
120012174,JE xx,259.44,21-OCT-2013,17-NOV-2013
100154992,DL x,270.44,21-OCT-2013,17-NOV-2013