我正在尝试为字母表中的每个字母+特殊字符创建一个xml文件,其结果来自我写的查询。
Select * from people; (random example)
示例:
hello_a.xml
hello_b.xml
hello_spec.xml
我已完成查询,此时返回所有行。我只想知道最好的方法。我是否列出了包含每个变量的字符串,并执行where table_column LIKE A%?或者有更好的方法来做到这一点。现在我有List实现,但我似乎无法找到特殊字符的SQL部分。
当我说特殊字符时,我的意思是“&”,“%”或数值。
编辑:使用JAXB将xml写入文件。
答案 0 :(得分:3)
目前还不完全清楚所以我猜你想写下这个查询的结果:
SELECT * FROM people
按特定列的第一个字符分为27个单独的文件。
以下不是Java,只有伪代码:
filenamePrefix = "hello_"
filenamePostfix = ".xml"
letters = "abc...xyz"
for letter in letters
upper = Uppercase(letter)
sqlquery = "SELECT * FROM people WHERE column LIKE '" + letter + "%'
OR column LIKE '" + upper + "%' ;"
results = runquery( sqlquery )
filename = filenamePrefix + letter + filenamePostfix
saveToFile( filename , results )
sqlquery = "SELECT * FROM people
WHERE NOT REGEXP_LIKE(column, '^[[:alpha:]]', 'i') ;"
/* 'i' stands for case Insensitive */
results = runquery( sqlquery )
filename = filenamePrefix + "spec" + filenamePostfix
saveToFile( filename , results )
答案 1 :(得分:2)
您可以将查询更改为以下内容:
select substr(name, 1, 1) as alpha, * from people order by alpha
然后,您可以迭代结果集并为结果集的alpha
列中的每个新字符创建文件。
这是Java中的示例代码,用于说明该方法:
Statement s = connection.createStatement();
String q = "select substr(name, 1, 1) as alpha, * from people order by alpha"
ResultSet rs = st.executeQuery(q);
FileWriter fw = null;
char alpha = null;
while(rs.next()) {
char newAlpha = rs.getString("alpha").charAt(0);
if(newAlpha != alpha) {
alpha = newAlpha;
if(fw != null) {
fw.close();
}
String fn = String.format("hello_%s.xml",
Character.isLetterOrDigit(alpha) ? alpha : "spec");
fw = new FileWriter(new File(fn));
}
//write record to open file writer
//your JAXB code goes here
//you should not iterate result set
}
fw.close();
请记住,代码尚未经过测试,因此可能无法正常工作或直接编译,但我希望它能很好地解释这种方法。
答案 2 :(得分:1)
我看到它的方式,不尝试使用SQL完成所有操作会容易得多。使用您拥有的查询并按名称(或您正在使用的任何字段)进行排序。这是一些伪造的代码,可以为你进行分组。
records = SQL_RESUT;
specialCharResults = new List();
currentCharResults = new List();
currentChar = "A";
for (record : records) {
if (record.name starts with special) {
specialCharResults.add(record);
} else {
if (record.name does not starts with currentChar) {
write out currentCharResults;
currentCharResults = new List();
currentChar = record.name first char;
} else {
currentCharResults.add(record);
}
}
write out currentCharResults; //currentChar never changes away from "Z"
write out specialCharResults;