解析短信的最佳方法是什么

用户名

我正在开发一个用于将短信解析为要存储在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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Flutter - 解析 Json 的最佳方法是什么?

来自分类Dev

解析字符串以插入变量的最佳方法是什么?

来自分类Dev

解析此数据的最佳Pythonic方法是什么?

来自分类Dev

严格解析字符串枚举的最佳方法是什么?

来自分类Dev

Android中JSON解析的最佳方法是什么?

来自分类Dev

使用Java解析行的最佳方法是什么?

来自分类Dev

解析此数据的最佳Pythonic方法是什么?

来自分类Dev

递增的最佳方法是什么?

来自分类Dev

检查字符串是否可以解析为int数组的最佳方法是什么?

来自分类Dev

用Rust解析二进制协议的最佳方法是什么

来自分类Dev

解析字符串中的字符串的最佳方法是什么?

来自分类Dev

在C#中,解析此WIKI标记的最佳方法是什么?

来自分类Dev

在C ++ 11中解析毫秒日期时间的最佳方法是什么

来自分类Dev

解析不一致的数据时,“发现”标题行的最佳方法是什么?

来自分类Dev

解析Bazel构建事件协议以搜索失败的目标和错误消息的最佳方法是什么?

来自分类Dev

使用PHP或JS解析扫描的PDF文件的最佳方法是什么?

来自分类Dev

将字符串解析为以null终止的数组的最佳方法是什么?

来自分类Dev

从javascript / typescript中的XML DOM解析媒体URL的最佳方法是什么?

来自分类Dev

为文章/评论/帖子等的作者解析HTML页面的最佳方法是什么?

来自分类Dev

解析仅包含一个巨大JsonObject(Gson)的JsonObject的最佳方法是什么

来自分类Dev

在 Python 中解析这些字符串的最佳方法是什么?

来自分类Dev

保持方法运行的最佳方法是什么

来自分类Dev

使方法异步运行的最佳方法是什么?

来自分类Dev

使方法异步运行的最佳方法是什么?

来自分类Dev

循环异步方法的最佳方法是什么?

来自分类Dev

最佳的相机校准方法是什么?

来自分类Dev

调用函数的最佳方法是什么?

来自分类Dev

创建Gmail功能的最佳方法是什么?

来自分类Dev

保护烧瓶终点的最佳方法是什么?

Related 相关文章

  1. 1

    Flutter - 解析 Json 的最佳方法是什么?

  2. 2

    解析字符串以插入变量的最佳方法是什么?

  3. 3

    解析此数据的最佳Pythonic方法是什么?

  4. 4

    严格解析字符串枚举的最佳方法是什么?

  5. 5

    Android中JSON解析的最佳方法是什么?

  6. 6

    使用Java解析行的最佳方法是什么?

  7. 7

    解析此数据的最佳Pythonic方法是什么?

  8. 8

    递增的最佳方法是什么?

  9. 9

    检查字符串是否可以解析为int数组的最佳方法是什么?

  10. 10

    用Rust解析二进制协议的最佳方法是什么

  11. 11

    解析字符串中的字符串的最佳方法是什么?

  12. 12

    在C#中,解析此WIKI标记的最佳方法是什么?

  13. 13

    在C ++ 11中解析毫秒日期时间的最佳方法是什么

  14. 14

    解析不一致的数据时,“发现”标题行的最佳方法是什么?

  15. 15

    解析Bazel构建事件协议以搜索失败的目标和错误消息的最佳方法是什么?

  16. 16

    使用PHP或JS解析扫描的PDF文件的最佳方法是什么?

  17. 17

    将字符串解析为以null终止的数组的最佳方法是什么?

  18. 18

    从javascript / typescript中的XML DOM解析媒体URL的最佳方法是什么?

  19. 19

    为文章/评论/帖子等的作者解析HTML页面的最佳方法是什么?

  20. 20

    解析仅包含一个巨大JsonObject(Gson)的JsonObject的最佳方法是什么

  21. 21

    在 Python 中解析这些字符串的最佳方法是什么?

  22. 22

    保持方法运行的最佳方法是什么

  23. 23

    使方法异步运行的最佳方法是什么?

  24. 24

    使方法异步运行的最佳方法是什么?

  25. 25

    循环异步方法的最佳方法是什么?

  26. 26

    最佳的相机校准方法是什么?

  27. 27

    调用函数的最佳方法是什么?

  28. 28

    创建Gmail功能的最佳方法是什么?

  29. 29

    保护烧瓶终点的最佳方法是什么?

热门标签

归档