Разобрать строку с разделителем ";" (Джава) - PullRequest
1 голос
/ 25 ноября 2011

У меня есть строка = "1,515 53,11 612,1 95,1; 0 0 0 0" Я пытаюсь разобрать его с помощью этого кода:

public class SendThread implements Runnable {
    public void run() 
    {
        socket = null;
        BufferedReader in;


        while (true)
        {
            // Loop until connected to server
            while (socket == null){
                try{
                    socket = new Socket ("192.168.137.1", 808);         
                }
                catch (Exception e) {
                    socket = null;

                    //Log.d("Connection:", "Trying to connect...");
                }
                try {
                Thread.sleep(30);
                } catch (Exception e) {}
            }

            // Get from the server   
            try {

                in = new BufferedReader(new InputStreamReader(socket.getInputStream()));

                Log.d("Connection: ", "connected");

                String line = null;

                while ((line = in.readLine()) != null) {

                    Log.d("Socket:", line);

                    NumberFormat nf = new DecimalFormat ("990,0");
                    String[] tokens = null;
                    String[] tempData = null;
                    String[] windData = null;

                    try {
                         tokens = line.split(";");
                         tempData = tokens[0].trim().split(" ");
                         windData = tokens[1].trim().split(" ");   
                    } catch (Exception error)
                    {
                         Log.d("Parsing error:", error+"");
                    }



                    for (int i = 0; i < currentTemp.length; i++)
                        currentTemp[i] = (Double) nf.parse(tempData[i]);
                    for (int i = 0; i < currentWind.length; i++)
                        currentWind[i] = (Double) nf.parse(windData[i]);

                    //Toast.makeText(getApplicationContext(), "Received data:", duration)
                    for (int i = 0; i < currentTemp.length; i++){
                        Log.d("Converted data: currentTemp["+i+"] = ", currentTemp[i]+"");
                    }
                    for (int i = 0; i < currentWind.length; i++){
                        Log.d("Converted data: currentWind["+i+"] = ", currentWind[i]+"");
                    }
                }
                socket = null;
                Log.d("Connection: ", "lost.");

            } 
            catch (Exception e) {
                    socket = null;
                    Log.d("Connection: ", "lost.");
                    Log.d("Connection:", e+"");
            }
        }
    }
}

Неверный код :( Но я не знаю лучшего способа удержания сокетного соединения:)

Я всегда получаю «java.text.ParseException: Unparseable number». Как это исправить?

токены, tempData, windData являются String []

Ответы [ 5 ]

3 голосов
/ 25 ноября 2011

Помимо того, что сказали другие, я ставлю, когда вы делаете

windData = tokens[1].split(" ");

, вы получаете

windDate = {"","0","0","0","0"} 

и пытаетесь проанализировать первый элемент как числоПопробуйте сделать:

try {
     tokens = line.split(";");
     tempData = tokens[0].trim().split(" ");
     windData = tokens[1].trim().split(" ");   
} catch (Exception error)
{
     Log.d("Parsing error:", error+"");
}
2 голосов
/ 25 ноября 2011

Вам не нужно избегать точки с запятой. Попробуйте просто сделать:

try {
     tokens = line.split(";");
     tempData = tokens[0].split(" ");
     windData = tokens[1].split(" ");
} catch (Exception error)
{
     Log.d("Parsing error:", error+"");
}

Я подозреваю, что ваша ошибка синтаксического анализа связана с завершающим пробелом после 95.1 в вашей входной строке. Как таковой, ваш массив tempData будет иметь 5 значений, последнее из которых ''. Попытка разобрать это как число даст вам это исключение.

1 голос
/ 25 ноября 2011

Вы можете использовать для этого строковый токенизатор.

    String s  = "1.515 53.11 612.1 95.1 ; 0 0 0 0";

    StringTokenizer tokenizer = new StringTokenizer(s,";");

    while(tokenizer.hasMoreElements()){
        StringTokenizer numberTokenize = new StringTokenizer(tokenizer.nextToken());
        while(numberTokenize.hasMoreElements()) {
            System.out.println(numberTokenize.nextElement());
        }
    }
1 голос
/ 25 ноября 2011

Хм, ваш код (как опубликовано) не генерирует это исключение. Во-вторых, "\\;" является избыточным, вы можете написать ";"

0 голосов
/ 25 ноября 2011

Попробуйте использовать \s в вашем разделении для пробелов;например, tempData = tokens[0].split("\s"); ... это символ пробела.

...