我正在开发一个用于将短信解析为要存储在sqlite db中的字符串的应用程序。
这是短信外观的示例。通话费样品。
Airtime payment made for UGX5,000 to KKL(0909xxxx).
Your Balance is UGX10,000.
Thank you for using KKL MobileMoney.
手机存款样本
You have received UGX100,000 from 09006700. Reason:J.
Your balance is UGX170,000.
移动汇款示例
You have sent UGX10,000 to 08970000.
Reason:j.
Your balance is UGX120,000.
Thank you for using KKL MobileMoney.
我感兴趣的是:-发送/接收/支付的金额。-从/发送/付款的号码。-原因-平衡。
到目前为止,我已经尝试使用split函数。
我使用的是字符串令牌的数组索引,但是在某些字符串上我得到了索引出界异常,但在某些字符串上却起作用了。
这是我到目前为止的代码...但是工作不一致!
if (str.startsWith(RECEIVED))
{
// for mm deposit
Log.e("msg", str);
String delimeter="[ .]+";
String[] tokens= str.split(delimeter);
for (int i=0;i < tokens.length;i++)
{
Log.e("Test",tokens[i]);
}
String amount =tokens[3];
String reason =tokens[6].trim();
String number=tokens[5];
String balance=tokens[11];
Log.e("Amount",amount);
Log.e("reasons",reason);
Log.e("number",number);
Log.e("balance",balance);
String type="Deposit";
db.addrecord(amount, type, reason, number, balance);
db.close();
}
else if(str.startsWith(SEND))
{
// for sent sms
Log.e("msg", str);
String delimeter="[ .]+";
String[] tokens= str.split(delimeter);
for (int i=0;i < tokens.length;i++)
{
Log.e("Test",tokens[i]);
}
String amount =tokens[3];
String reason =tokens[6].trim();
String number=tokens[5];
String balance=tokens[11];
Log.e("Amount",amount);
Log.e("reasons",reason);
Log.e("number",number);
Log.e("balance",balance);
String type="Payment";
db.addrecord(amount, type, reason, number, balance);
db.close();
}
else if(str.startsWith(AIRTIMEPAYMENT))
{ // for airtime sms
Log.e("msg", str);
String delimeter="[ .]+";
String[] tokens= str.split(delimeter);
for (int i=0;i < tokens.length;i++)
{
Log.e("Test",tokens[i]);
}
String amount =tokens[4];
String reason =tokens[0]+ " "+ tokens[1];
String number=tokens[7];
String balance=tokens[11];
Log.e("Amount",amount);
Log.e("reasons",reason);
Log.e("number",number);
Log.e("balance",balance);
String type="Air Time ";
db.addrecord(amount, type, reason, number, balance);
db.close();
}
关于如何最好地处理解析的任何提示/建议?
我是Java / Android初学者!
罗纳德
这是我所做的编辑
private Map<String, String> parseSms(String s){
Map<String, String> ret = new HashMap<String, String>();
s = s.replace("\n", "");
StringTokenizer t = new StringTokenizer(s, ".");
while (t.hasMoreTokens()){
String b = t.nextToken().trim();
if (b.startsWith("You have sent") ||(b.startsWith("You have received"))){
String type = getType(b);
String parsed = parseAmount(b);
String number = parseNumber(b);
ret.put("amount", parsed);
ret.put("number", number);
ret.put("type", type);
}else if(b.startsWith("Your")){//balance
String parsed = parseAmount(b);
ret.put("balance", parsed);
}else if (b.startsWith("Reason")){
ret.put("reason", b.toString());
}
else if( b.startsWith("Airtime"))
{
String type = getType(b);
String parsed = parseAmount(b);
String number = parseNumber(b);
ret.put("amount", parsed);
ret.put("number", number);
ret.put("reason", "Air Time Payment");
ret.put("type", type);
}else if(b.startsWith("Your")){//balance
String parsed = parseAmount(b);
ret.put("balance", parsed);
}
}
return ret;
}
它解决了问题。
这是一种更健壮的解析方法。
用常量替换相关的字符串。就循环而言,使用Map比String []安全得多。您还可以将match与regexp一起使用。
private void test(){
String sms = "You have sent UGX10,000 to 08970000.\n" +
"Reason:j.\n" +
"Your balance is UGX120,000.\n" +
"Thank you for using KKL MobileMoney.";
/*String rec = "You have received UGX100,000 from 09006700. Reason:J.\n" +
"Your balance is UGX170,000.";
String air = "Airtime payment made for UGX5,000 to KKL(0909xxxx).\n" +
"Your Balance is UGX10,000.\n" +
"Thank you for using KKL MobileMoney.";
*/
Map<String, String> data = parseSms(sms);
saveToDB(data);
}
private void saveToDB(Map<String, String> data){
db.addrecord(data.get("amount"), data.get("type"), data.get("reason"), data.get("number"), data.get("balance"));
db.close();
}
private Map<String, String> parseSms(String s){
Map<String, String> ret = new HashMap<String, String>();
s = s.replace("\n", "");
StringTokenizer t = new StringTokenizer(s, ".");
while (t.hasMoreTokens()){
String b = t.nextToken().trim();
if (b.startsWith("You have sent") || (b.startsWith("Airtime") || (b.startsWith("You have received")))){
String type = getType(b);
String parsed = parseAmount(b);
String number = parseNumber(b);
ret.put("amount", parsed);
ret.put("number", number);
ret.put("type", type);
}else if(b.startsWith("Your")){//balance
String parsed = parseAmount(b);
ret.put("balance", parsed);
}else if (b.startsWith("Reason")){
ret.put("reason", b.toString());
}
}
return ret;
}
private String getType(String s){
if (s.startsWith("You have sent"))//Use your constants
return "Payment";
else if (s.startsWith("Airtime"))
return "Air time";
else if (s.startsWith("You have received"))
return "Deposit";
return "Unknown";
}
private String parseNumber(String s){
String numberFragment = s.substring(s.lastIndexOf(' '), s.length());//extract number
return numberFragment;
}
private String parseAmount(String s){
char[] arr = s.toCharArray();
StringBuffer sb = new StringBuffer();
boolean parsingNumber = false;
for (char c: arr){
if (Character.isDigit(c))
parsingNumber = true;
if (Character.isLetter(c) && c != ',' )
parsingNumber = false;
if (parsingNumber && c == ' ')//we have reached end of digit series
break; //done
if (parsingNumber)
sb.append(c);
}
return sb.toString();
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句