2020-11-01

【Kotlin】讀取 CSV 檔案

參考資料 ----

kotlin-csv


Kotlin 已有免費套件,可用來讀取 CSV


app 層級的 build.gradle

 
dependencies {

    ...
    ...
    implementation("com.github.doyaaaaaken:kotlin-csv-jvm:0.7.3")
}
 



在專案的 /src/main/ 建立 assets 資料夾,並將在 【C#】以程式列出 中文字 與 BIG5 內碼 的對應表 這篇筆記所生成的 CSV 檔置入 assets 下 


 



activity_main.xml 放 2 個 TextView,一個用來顯示中文,一個用來顯示 BIG5 內碼
 
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/lblBig5"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintHorizontal_bias="0.498"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.36" />

    <TextView
        android:id="@+id/lblCode"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>
 



MainActivity.kt
 
class MainActivity : AppCompatActivity()
{
    private val TAG = "MainActivity"

    override fun onCreate(savedInstanceState: Bundle?)
    {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        ReadCSVTask().execute(null, null, null)
    }


    private inner class ReadCSVTask : AsyncTask<Any, Any, Any>()
    {
    	// 因為中文字 - 內碼是一對一的關係,所以我決定將讀進來的 CSV 存入 Map 
        val mMap = emptyMap<String, String>().toMutableMap()

        override fun onPreExecute()
        {
            Log.d(TAG, "ReadCSVTask onPreExecute...")
        }

        override fun doInBackground(vararg p0: Any?): Any
        {
            Log.d(TAG, "ReadCSVTask doInBackground...")
            
            // 將 CSV 讀入字串中
            val fileText = applicationContext.assets.open("big5.csv").bufferedReader().use {
                it.readText()
            }


            val tsvReader = csvReader { charset = "UTF-8"    // 文字格式
                                        quoteChar = '"'      // 包覆元素的符號
                                        delimiter = ','      // 分隔字元
                                    }
            rows = tsvReader.readAll(fileText)
            for(mrow in rows)
            {
                // mrow[1] 是中文字
                // mrow[0] 是 BIG5 內碼
                mMap[mrow[1]] = mrow[0]
            }
            return ""
        }

        override fun onPostExecute(args: Any)
        {
            Log.d(TAG, "ReadCSVTask onPostExecute...")

            lblBig5.text = "麟"
            lblCode.text = mMap["麟"]            
        }
    }
}
 




沒有留言:

張貼留言