0

所以我对 Android 比较陌生,我正在尝试解析基于 Web 的 CSV 文档,并在我的应用程序中使用该文档中的两个值。我已经成功解析了一个 CSV 文档,但它只有 1 行。我试图解析的文档如下所示:

Light,2012-08-20T11:04:42.407301Z,107
Temperature,2012-08-20T11:04:42.407301Z,24   

我正在尝试获取“107”和“24”值。谁能解释如何做到这一点?这是我当前的 CSV 解析器类的代码,它可以成功解析一行 CSV 数据。

public class CSVParser {
    static InputStream is = null;
    private String value;

    public String getCSV(String url) {
        // Making HTTP request
        try {
            // defaultHttpClient
            DefaultHttpClient httpClient = new DefaultHttpClient();
            HttpGet httpGet = new HttpGet(url);

            HttpResponse httpResponse = httpClient.execute(httpGet);
            HttpEntity httpEntity = httpResponse.getEntity();
            is = httpEntity.getContent();           

        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        BufferedReader reader = new BufferedReader(new InputStreamReader(is));
        try {
            String line;
            while ((line = reader.readLine()) != null) {
                String[] RowData = line.split(",");
                value = RowData[2];
                // do something with "data" and "value"
            }
        } catch (IOException ex) {
            // handle exception
        } finally {
            try {
                is.close();
            } catch (IOException e) {
                // handle exception
            }
        }
        return value;
    }
}
4

2 回答 2

2

我看到您正在分配 value = rowData [2],这看起来像在 2 行 csv 上,您每次读取一行时只返回 24,因为您分配了 value。即第一次分配为 107,然后在下一个 readLine 上它被 24 覆盖。

您应该使 value 变量成为一个数组(如果您知道要获取的项目数)或可以容纳多个字符串的列表。然后在每个 readLine 循环中添加到这个数组或列表中。

所以第一次是(如果使用 value as a List<string>

  while ((line = reader.readLine()) != null) {
    string[] RowData = line.split(",");
    value.add(RowData[2]);
  }

第一次它将添加 107 到列表中,然后下一行将添加 24。

于 2012-08-20T11:28:27.170 回答
1

你有正确的想法 - 所以在你的想法中,while循环为流中的每一行运行一次,直到你用完行(readline返回null)

然后使用 split 将单行拆分为多个字符串。在您的情况下 split 应该返回三个数组(列表中的三个逗号分隔元素)

  • RowData[0] 将包含文本描述(例如 Light)
  • RowData[1] 将包含时间戳
  • RowData[2] 将包含您想要的数字

如果你想要一个整数,你可能想要做类似 Integer.Parse(RowData[2])

于 2012-08-20T11:24:56.387 回答