Showing posts with label Đọc dữ liệu. Show all posts
Showing posts with label Đọc dữ liệu. Show all posts

Wednesday, November 22, 2017

Lấy text từ trang web

Để đọc mạng lấy text từ trang web không phải thuần txt, ta dùng class sau.
class RequestTask extends AsyncTask<String, String, String>{
     @Override   
     protected String doInBackground(String... url) {
         
     HttpClient client = new DefaultHttpClient();
     HttpGet httpget = new HttpGet(url[0]);

     try {
     HttpResponse getResponse = client.execute(httpget);
     final int statusCode = getResponse.getStatusLine().getStatusCode();

     if(statusCode != HttpStatus.SC_OK) {
     Log.w("MyApp", "Download Error: " + statusCode + "| for URL: " + url);
                      return null;
                  }
     String line = "";
     StringBuilder total = new StringBuilder();
     HttpEntity getResponseEntity = getResponse.getEntity();
     BufferedReader reader = new BufferedReader(new InputStreamReader(getResponseEntity.getContent())); 

     while((line = reader.readLine()) != null) {
            total.append(line);
           }
  line = total.toString();
           return line;
          } catch (Exception e) {
             Log.w("MyApp", "Download Exception : " + e.toString());
          }
          return null;
     }
     @Override
     protected void onPostExecute(String result) {
             
     t.setText(result);
     }
     }
Gọi class bên dưới dòng setContentView, cho vào trong một progressBar để chờ.
mProgressDialog = new ProgressDialog(this);
           mProgressDialog.setMessage("Loading, please wait...");
            mProgressDialog.show();
        new Thread(new Runnable(){
            public void run(){
           
               new RequestTask().execute("http://llkqe.blogspot.com/2016/06/blog-post.html");
                if(mProgressDialog.isShowing())
                {
                   mProgressDialog.dismiss();
                }
            }
        }).start();
    }

Lúc này văn bản đọc ra trông như sau.

Để lấy được chuỗi cần dùng, ta xử lý chặt chuỗi và lấy String sau một String đặc biệt ta thêm vào trước chuỗi, ở đây là chữ “Đây”.
Khai báo mảng để add String cần lấy vào.
ArrayList<String> docmang = new ArrayList<String>();
Sau đó trong hàm @Override
          protected void onPostExecute(String result) {
Thay các dòng sau vào.
String l=result.toString();
             
String a[] = l.split(" ");
for (int i = 0; i < a.length; i++) { 
if(a[i].equals("Đây")){
docmang.add(a[i+7]);                   
  }
}
String r="";
for (int i = 0; i < docmang.size(); i++) {
r=r+docmang.get(i)+"\n";
}
t.setText(r+"");
Kết quả chạy ra sẽ như sau.

Để tránh bị crash khi không có mạng, cần kiểm tra kết nối mạng, để nếu không có mạng thì hiện Toast để người dùng biết.
Khi mới học lập trình, tôi thấy đọc ra toàn ký tự như giun dế nên nghĩ mình làm sai ở đâu đó nhưng không phải, cần xử lý thêm mới được.
Trong các sách dạy lập trình người ta dùng trang web thuần txt để làm ví dụ nên nếu không biết bạn chạy trang khác sẽ không ra giống như sách. Thực tế là phải xử lý thêm như trên, sách người ta không dạy cái ăn ngay được!
Cách này dùng để khi ta muốn làm ứng dụng cập nhật kết quả bóng đá thì post kết quả lên blog nào đó, mỗi khi người dùng mở app, ứng dụng sẽ tự vào đọc lấy kết quả ta đã post rồi xử lý cho vào chương trình.

Wednesday, October 4, 2017

Swift đọc file txt

Hãy tạo một file txt có nội dung tùy ý, một bài thơ chẳng hạn, để Endcoding là UTF-8, kéo nó vào cây thư mục bên trái màn hình.

Ta sẽ đọc và set nó vào một textview.
Khai báo, định vị textView tên gi. Copy các dòng sau vào dưới dòng định vị textView
let path2 = NSBundle.mainBundle().pathForResource("t1", ofType: "txt")!
        var read : String = ""
      do {
        try read = NSString(contentsOfFile: path2, encoding: NSUTF8StringEncoding) as String
gi.text = read
gi.font = UIFont.italicSystemFontOfSize(17)
gi.textColor = UIColor.blueColor()
gi.textAlignment = NSTextAlignment.Center
           
        }
        catch let error as NSError {
            // print("ERROR : reading from file \(fileName) : \(error.localizedDescription)")
        }
Nếu bạn để file txt trong một thư mục rồi mới kéo nó vào trong project, ví dụ thư mục tên raw thì hãy sửa chữ "t1" bên trong pathForResource thành "raw/t1",
Các dòng còn lại là ta đọc nó ra rồi set vào textView, để font nghiêng cỡ 17, đổ màu xanh và căn vào giữa.

Nếu ta muốn đọc file ra thành từng dòng và set mỗi dòng vào một phần từ mảng, ta làm như sau.
do {
            try read = NSString(contentsOfFile: path2, encoding: NSUTF8StringEncoding) as String
            var ar = read.componentsSeparatedByString("\n")
            let t=ar[1]
          
            gi.text = t
            gi.font = UIFont.italicSystemFontOfSize(17)
            gi.textColor = UIColor.blueColor()
            gi.textAlignment = NSTextAlignment.Center
           
        }
        catch let error as NSError {
            // print("ERROR : reading from file \(fileName) : \(error.localizedDescription)")
        }
Ta đọc vào mảng ar và lấy ra dòng thứ hai, rồi set ra textView.

Đọc dữ liệu trong Java

Giả sử ta muốn đọc một bài thơ ghi trong file txt, khi tạo file txt, bạn nhớ khi save thì để dòng Encoding là UTF-8.

Tạo một folder có tên raw, copy bài thơ ở dạng txt vào đó.

Bây giờ tạo một class bất kỳ với giao diện gồm 3 textView, một để ghi tên bài thơ, một là nội dung, thứ ba tên tác giả.
Khai báo, tham chiếu địa chỉ các textView.
Copy đoạn code sau vào dưới dòng tham chiếu địa chỉ
InputStream in = this.getResources().openRawResource(R.raw.tho);
     try
      {
     byte[] buffer = new byte[in.available()];
     while (in.read(buffer) != -1);
     String jsontext = new String(buffer);

       tv2.setText(jsontext);           
          
     }
   catch (IOException e)
     {
             //return null;
}
Ấn tổ hợp Ctrl+Shift+O để nhập các thư viện cần dùng.
Trong đoạn code này, ta đọc file txt lưu trong file raw và set nội dụng ra textView tv2. Ghi thêm tên bài bài thơ là ”Chiều thu” vào textView tv, tác giả  Teika, một nhà thơ cổ điển Nhật vào textvew tv3.
Chạy ra màn hình, ta có kết quả như sau.

Có những trường hợp ta muốn đọc theo từng dòng, lấy kết quả mỗi dòng sẽ thành một phần từ trong mảng, ta sẽ làm như sau.
Khai báo một mảng arraylist.
ArrayList<String> ar = new ArrayList<String>();
Copy đoạn code sau thay vào đoạn trên.
String line = "";
     try {
InputStream  In = this.getResources().openRawResource(R.raw.tho);
              InputStreamReader inputReader = new InputStreamReader(In);
              BufferedReader BR = new BufferedReader(inputReader);
     while ((line = BR.readLine()) != null) {
          ar.add(line);
     }
     BR.close();

     } catch (IOException e) {
     e.printStackTrace();
}
     tv2.setText(ar.get(3));
Ở đây, ta đọc dữ liệu theo từng dòng vào mảng ar và lấy dòng thứ tư để set ra màn hình.