社内se × プログラマ × ビッグデータ

プログラミングなどITに興味があります。

Android(kotlin) テキストファイルを読み込む

編集・作成するファイル
  • words.csv (読み込むファイル)
  • WordFromText.kt (読み込んだデータを格納するエンティティクラス)
  • WordManager.kt (ファイル読み込み用クラス)
  • MainActivity.kt (WordManager を呼び出す)
words.csv 読み込むファイルを用意する

以下のようなテキストファイルを用意します。
英単語とその日本語訳が書かれています。
英単語と日本語訳はタブ(TAB)で区切られているとします。

abstracted	 抽出された / ぼんやりした
counterfoil	 小切手(為替の)控え 
northbound	 北方行きの 

用意したファイルは assets ディレクトリに配置しておきます。

WordFromText.kt (読み込んだデータを格納するエンティティクラス) を作成する

2つしか変数がないので、エンティティクラスで扱うまでもないかもしれませんが、個人的に単なる文字列で扱うよりも好みなので作成しています。

class WordFromText(
    val english: String,
    val japanese: String
) {
}
WordManager.kt (ファイル読み込み用クラス) を作成する
class WordManager(context: Context) {
    private val myContext = context
    private var wordList: MutableList<WordFromText> = mutableListOf()

    fun getWordsFromText(): List<WordFromText> {
        Log.d("MyLog at WordManager", "Called getWordsFromText()")
        // Read text file & create objects
        myContext.assets.open("words.csv").reader(charset = Charsets.UTF_8).useLines {lines -> lines.forEach {
            val parts =  it.split("\t")
            wordList.add(WordFromText(parts[0], parts[1])) }}
        return wordList
    }
}
  • assets ディレクトリ内のファイルにアクセスするため、コンテキストを受け取るようにしています。コンテキストがあれば、myContext.assets.open("ファイル名") で assets ディレクトリ内のファイルにアクセスが可能です。
  • getWordsFromText() は下のような流れになっています。

1. ファイルを1行ずつ読み取る。
2. タブ(TAB) で分離
3. 読み取った行ごとに WordFromText オブジェクトを作り、それをリスト(wordList)に格納
4. 1 - 3 の繰り返し
5. 全ての行を読み取ったら、リスト(wordList)を返す

MainActivity.kt から WordManager を呼び出す
override fun onCreate(savedInstanceState: Bundle?) {
    (省略)
        val wm = WordManager(this@MainActivity)
        val words = wm.getWordsFromText()[f:id:blueskyarea:20200507190722p:plain]
        words.forEach {
            Log.d("MyLog at MainActivity", "Got English : ${it.english}, Japanese : ${it.japanese}")
        }
    (省略)
}
  • テスト用なので、onCreate() に書いていますが、ボタンクリックなどのイベントをベースに呼び出されるメソッドに書いたりもすると思われます。
  • this だけでもコンテキストを渡せますが、this@MainActivity と書くことで、どの Activity クラスのコンテキストであるかが明示されます。
  • きちんと読み取られているかを1行ずつ出力してチェックします。
ビルド・実行

Run ボタンをクリックして、ビルド・実行させます。
Logcat で以下のようなメッセージが取得されれば、きちんと読み取られていると確認できます。
f:id:blueskyarea:20200507190722p:plain