20
19

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

テキストファイルの読み込み

Last updated at Posted at 2018-01-29

CSVやtxtファイル等の外部ファイルに入っているテキストファイルを読み込むことをやってみる。キャラの名前とそのキャラのしゃべる文章を1行として、IDで管理することを想定。テキストは下記のようなものをタブ区切りで用意。これらを分解して2次配列にして管理するまでの内容です。

text
#ID	Name	Message
1	やすし	こんにちは!
2	たけし	はい、こんにちは!
3	やすし	あなたはピチョンさんですか?
4	たけし	いいえ、私はピチョンではありません、たけしです。

Text[0,0] == 1
Text[0,1] == やすし
Text[0,2] == こんにちは!

このようにしたかった訳です。

#事前準備
上記のテキストファイルをいれるフォルダを作る。"Resources"というフォルダを作成してやると、ソースコード上からリソースのロードができるようになる特別なフォルダになります。

2018-01-29_21h53_35.png

この中に上記のテキストファイルを入れます。

#概要

処理の流れは下記のように実行。

  1. テキストをまるっと全部取り込む
  2. まるっと取り込んだテキスト1行1行を1次配列に入れ込む
  3. テキストの行数と列数を取得して最終的に入れ込む2次配列のサイズを決める
  4. 2で取り込んだ1行1行をタブ区切りで2次配列にfor文で入れ込む

以下コード。

C#
public class LoadText : MonoBehaviour {

    public string[] textMessage; //テキストの加工前の一行を入れる変数
    public string[,] textWords; //テキストの複数列を入れる2次元は配列 

    private int rowLength; //テキスト内の行数を取得する変数
    private int columnLength; //テキスト内の列数を取得する変数

    private void Start()
    {
        TextAsset textasset = new TextAsset(); //テキストファイルのデータを取得するインスタンスを作成
        textasset = Resources.Load("Test", typeof(TextAsset) )as TextAsset; //Resourcesフォルダから対象テキストを取得
        string TextLines = textasset.text; //テキスト全体をstring型で入れる変数を用意して入れる
        
        //Splitで一行づつを代入した1次配列を作成
        textMessage = TextLines.Split('\n'); //

        //行数と列数を取得
        columnLength = textMessage[0].Split('\t').Length;
        rowLength = textMessage.Length;

        //2次配列を定義
        textWords = new string[rowLength, columnLength];

        for(int i = 0; i < rowLength; i++)
        {

            string[] tempWords = textMessage[i].Split('\t'); //textMessageをカンマごとに分けたものを一時的にtempWordsに代入

            for (int n = 0; n < columnLength; n++)
                {
                textWords[i, n] = tempWords[n]; //2次配列textWordsにカンマごとに分けたtempWordsを代入していく
                Debug.Log(textWords[i, n]);
            }
        }
    }
}

###変数
テキストを入れ込む段階で一時的に使う1次配列と、最終的に管理したい2次配列を用意。あとは2次配列を作る際に必要なサイズを決めるのに使う行数と列数を取得する変数を用意します。

C#
    public string[] textMessage; //テキストの加工前の一行を入れる変数
    public string[,] textWords; //テキストの複数列を入れる2次元は配列 

    private int rowLength; //テキスト内の行数を取得する変数
    private int columnLength; //テキスト内の列数を取得する変数

###TextAsset
テキストファイルをまるっと丸ごと入れ込む箱はTextAsset型のインスタンスを作成。その中にResourceフォルダ内にあるテキストファイルを読み込んで入れ込みました。このままではどうやらまだTextAssetの状態(?)ならしく、これをデータとしてきちんと扱えるようにsrting型に直してやる必要があるようです。なのでそのstring型のデータを入れる変数を用意しtextasst.textでこれまたまるっとstring型の中へ入れました。

C#
   private void Start()
    {
        TextAsset textasset = new TextAsset(); //テキストファイルのデータを取得する変数を用意
        textasset = Resources.Load("Test", typeof(TextAsset) )as TextAsset; //Resourcesフォルダから対象テキストを取得
        string TextLines = textasset.text; //テキスト全体をstring型で入れる変数を用意して入れる

###基準の文字を元に行ごとに分割する
Splitを使用します。今はテキストファイル全体がstring型で収納されているので、それをエスケープ文字を基準に分割します。textMessageは最初に用意してあげた1次的に使用する1次配列です。

C#
        //Splitで一行づつを代入した1次配列を作成
        textMessage = TextLines.Split('\n'); //

このSplitでの行ごとの分割ですが、特に配列側で添え字で指定してあげなくても勝手に配列を作ってくれます。一番上のテキストの例ですと5行あるので、textMessage[0]~textMessage[4]まで自動で作られます。ですが、2次配列で同じようなことをやるとなぜかエラーが出てできませんでしたので、きちんと2次配列のサイズを決めてあげる必要がありました。それが次。
###テキストの列数と行数を取得

C#
        columnLength = textMessage[0].Split('\t').Length;
        rowLength = TextLines.Split('\n').Length;

分割したものの数を数えていれています。(rowLength = TextLines.Split('\n').Length;となっていたものをrowLength = textMessage.Length;に修正!@sh_akiraさんご指摘ありがとうございます!)

###2次配列を定義してデータを入れ込み

C#
        //2次配列を定義
        textWords = new string[rowLength, columnLength];

        for(int i = 0; i < rowLength; i++)
        {

            string[] tempWords = textMessage[i].Split('\t'); //textMessageをカンマごとに分けたものを一時的にtempWordsに代入

            for (int n = 0; n < columnLength; n++)
                {
                textWords[i, n] = tempWords[n]; //2次配列textWordsにカンマごとに分けたtempWordsを代入していく
                Debug.Log(textWords[i, n]);
            }
        }

2次配列のサイズを定義してあげて、あとはよくあるforの入れ子でデータを入れ込み。Debug.Logでコンソールに書き出してチェックします。

2018-01-29_22h33_05.png

無事読み込まれていることが確認できました!

20
19
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
20
19

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?