2019-07-21に更新

Ascii-based floor map をCSVに変換したいぜ☆(^~^)

読了目安:11分

Git hub: ascii-based-floor-map-to-csv

CCCCC..BBBB..AAAAAAA
C..................A
C.FFF..EEEE..DDDDD.A
C.FFF..EEEE..DDDDD.A
C..................A
CCCCC........AAAAAAA

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 こういうのを☆」

CHAR X Y
C    0 0
C    1 0
C    2 0
C    3 0
C    4 0
B    7 0

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 CSV形式に変換したいぜ☆」

KIFUWARABE_80x100x8_01_Futu.gif
「 元号は もう2回変わってるのに……☆」

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 そんなツール もうあるんじゃないの?
rogue ascii map csv で検索してみましょう」

(カタカタカタ)

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 JSON形式のは出てくるんだけどな☆
大した機能は要らないんだぜ☆ Python3 で自力実装してしまおう☆」

KIFUWARABE_80x100x8_01_Futu.gif
「 2時間探して見つからないのなら 自力実装した方が早いもんな☆」

Python3入門 テキストファイル読み書きの基礎

#
# Note.
#
# Root directory: Visual studio code workspace root.
#
file_name = "./ascii-floor-map-to-csv/data/floor-map.txt"

try:
    file = open(file_name)
    lines = file.readlines()
    for line in lines:
        print(line, end="")
except Exception as e:
    print(e)
finally:
    file.close()
CCCCC..BBBB..AAAAAAA
C..................A
C.FFF..EEEE..DDDDD.A
C.FFF..EEEE..DDDDD.A
C..................A
CCCCC........AAAAAAA

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 よし、読取は十分だぜ☆」

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 文字列を先頭から1文字ずつ 順番に読むことはできる☆?」

#
# Note.
#
# Root directory: Visual studio code workspace root.
#
file_name = "./ascii-floor-map-to-csv/data/floor-map.txt"

try:
    file = open(file_name)
    lines = file.readlines()
    for line in lines:
        for char in line:
            print(char)
        print("[new line]")
except Exception as e:
    print(e)
finally:
    file.close()

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 for文で十分なようだぜ☆ 行末に CR-LF が出てくるんだが☆」

KIFUWARABE_80x100x8_01_Futu.gif
「 改行は無視すれば十分だろう☆」

【Python入門】for文でデータのindexを取得する方法

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 イネムリー(enumerate)という関数を使うとインデックスを取得しながら for文を回せるらしいぜ☆
あとで使ってみよ……☆」

#
# Note.
#
# Root directory: Visual studio code workspace root.
#
file_name = "./ascii-floor-map-to-csv/data/floor-map.txt"

try:
    file = open(file_name)
    lines = file.readlines()
    for y, line in enumerate(lines):
        for x, char in enumerate(line):
            print("({},{}) {}".format(x, y, char))
        print("[new line]")
except Exception as e:
    print(e)
finally:
    file.close()
(0,0) C
(1,0) C
(2,0) C
(3,0) C
(4,0) C
(5,0) .
(6,0) .
(7,0) B
(8,0) B
(9,0) B
(10,0) B
(11,0) .

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 いい感じだぜ☆
行で読込ながら 行で書き込めば 使用メモリも小さく抑えられるぜ☆」

KIFUWARABE_80x100x8_01_Futu.gif
「 気にする時代でもないのに……☆」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 Python3 って .writeln() 無いのかだぜ☆?
\r\n を書くと改行2つ入るしな……☆ \n にしとくのが無難かだぜ☆?
こんなん残ってるとか なんか C言語 みたいだな……☆」

Pythonの文字列の改行方法と便利な操作まとめ

input

CCCCC..BBBB..AAAAAAA
C..................A
C.FFF..EEEE..DDDDD.A
C.FFF..EEEE..DDDDD.A
C..................A
CCCCC........AAAAAAA

program

#
# Note.
#
# Root directory: Visual studio code workspace root.
#
input_file_name = "./ascii-floor-map-to-csv/data/floor-map.txt"
output_file_name = "./ascii-floor-map-to-csv/data/floor-map.csv"

try:
    in_file = open(input_file_name)

    try:
        out_file = open(output_file_name, 'w', encoding='utf-8')

        out_file.write("X,Y,CHAR\n")

        lines = in_file.readlines()
        for y, line in enumerate(lines):
            for x, char in enumerate(line):
                if char != '\n':
                    out_file.write("{},{},{}\n".format(x, y, char))
    except Exception as e:
        print(e)
    finally:
        out_file.close()

except Exception as e:
    print(e)
finally:
    in_file.close()

print("Info    : Finished.")

output

X,Y,CHAR
0,0,C
1,0,C
2,0,C
3,0,C
4,0,C
5,0,.
6,0,.
7,0,B
8,0,B
9,0,B
10,0,B
11,0,.
12,0,.
13,0,A
14,0,A
15,0,A
16,0,A
17,0,A
18,0,A
19,0,A
0,1,C
1,1,.
2,1,.
3,1,.
4,1,.
5,1,.
6,1,.
7,1,.
8,1,.
9,1,.
10,1,.
11,1,.
12,1,.
13,1,.
14,1,.
15,1,.
16,1,.
17,1,.
18,1,.
19,1,A
0,2,C
1,2,.
2,2,F
3,2,F
4,2,F
5,2,.
6,2,.
7,2,E
8,2,E
9,2,E
10,2,E
11,2,.
12,2,.
13,2,D
14,2,D
15,2,D
16,2,D
17,2,D
18,2,.
19,2,A
0,3,C
1,3,.
2,3,F
3,3,F
4,3,F
5,3,.
6,3,.
7,3,E
8,3,E
9,3,E
10,3,E
11,3,.
12,3,.
13,3,D
14,3,D
15,3,D
16,3,D
17,3,D
18,3,.
19,3,A
0,4,C
1,4,.
2,4,.
3,4,.
4,4,.
5,4,.
6,4,.
7,4,.
8,4,.
9,4,.
10,4,.
11,4,.
12,4,.
13,4,.
14,4,.
15,4,.
16,4,.
17,4,.
18,4,.
19,4,A
0,5,C
1,5,C
2,5,C
3,5,C
4,5,C
5,5,.
6,5,.
7,5,.
8,5,.
9,5,.
10,5,.
11,5,.
12,5,.
13,5,A
14,5,A
15,5,A
16,5,A
17,5,A
18,5,A
19,5,A

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 よし でけた☆」

結局、座席番号も欲しいぜ☆

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 Rogue形式で いけると思ったのに……☆」

C,C,C,C,C,.,.,B,B,B,B,.,.,A,A,A,A,A,A,A
C,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,A
C,.,F,F,F,.,.,E,E,E,E,.,.,D,D,D,D,D,.,A
C,.,F,F,F,.,.,E,E,E,E,.,.,D,D,D,D,D,.,A
C,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,A
C,C,C,C,C,.,.,.,.,.,.,.,.,A,A,A,A,A,A,A

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 じゃあ カンマで区切って、数を入れていくかだぜ☆
ブロックごとに 1スタートで振るかだぜ☆?」

KIFUWARABE_80x100x8_01_Futu.gif
「 ID は 通し でいいのでは☆?
座席番号は フィールドで☆」

 5, 4, 3, 2, 1, 0, 0, 4, 3, 2, 1, 0, 0,18,17,16,15,14,13,12
 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,11
 7, 0, 3, 2, 1, 0, 0, 4, 3, 2, 1, 0, 0, 5, 4, 3, 2, 1, 0,10
 8, 0, 4, 5, 6, 0, 0, 5, 6, 7, 8, 0, 0, 6, 7, 8, 9,10, 0, 9
 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8
10,11,12,13,14, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 もう番号振ったのに……☆ 振り直しだぜ☆」

27,26,25,24,23, 0, 0,22,21,20,19, 0, 0,18,17,16,15,14,13,12
28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,11
29, 0,57,56,55, 0, 0,50,49,48,47, 0, 0,41,40,39,38,37, 0,10
30, 0,58,59,60, 0, 0,51,52,53,54, 0, 0,42,43,44,45,46, 0, 9
31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8
32,33,34,35,36, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 つまり こう☆」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 かたや Rogue形式、かたや CSV形式、ループで一緒に できないな……☆」

KIFUWARABE_80x100x8_01_Futu.gif
「 なんでも 1回で 片付けようとするなだぜ☆
2回に分けてできるのなら、2回でいい☆」

#
# Note.
#
# Root directory: Visual studio code workspace root.
#
block_input_file = "./ascii-floor-map-to-csv/data/floor-map.txt"
table_input_file = "./ascii-floor-map-to-csv/data/table-number-map.txt"
output_file_name = "./ascii-floor-map-to-csv/auto-generated/floor-map.csv"

try:
    bl_file = open(block_input_file)
    try:
        ta_file = open(table_input_file)

        try:
            out_file = open(output_file_name, 'w', encoding='utf-8')

            out_file.write("ID, X,Y,CHAR\n")
            id_column = []
            x_column = []
            y_column = []
            block_column = []

            bl_lines = bl_file.readlines()
            for y, line in enumerate(bl_lines):
                for x, char in enumerate(line):
                    if char != '\n':
                        x_column.append(x)
                        y_column.append(y)
                        block_column.append(char)

            ta_lines = ta_file.readlines()
            for row in ta_lines:
                cols = row.split(",")
                for x, number_text in enumerate(cols):
                    num = int(number_text)
                    if num != 0:
                        id_column.append(num)

            for i, id in enumerate(id_column):
                out_file.write("{},{},{},{}\n".format(
                    id, x_column[i], y_column[i], block_column[i]))

        except Exception as e:
            print(e)
        finally:
            out_file.close()

    except Exception as e:
        print(e)
    finally:
        ta_file.close()
except Exception as e:
    print(e)
finally:
    bl_file.close()

print("Info    : Finished.")

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 メモリ食うけど 頭を使わず 速く実装できるの優先で☆」

ID, X,Y,CHAR
27,0,0,C
26,1,0,C
25,2,0,C
24,3,0,C
23,4,0,C
22,5,0,.
21,6,0,.
20,7,0,B
19,8,0,B
18,9,0,B
17,10,0,B
16,11,0,.

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 多分あってるのだろう☆ こんな感じで☆」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 えっ☆!? 列名の前にスペースが入ってたら 読み取り時に前スペース判定☆!?
不便なやつだな……☆」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 参加者数が30で、机の数が60だったとき 机が30個に切れてしまうな☆」

KIFUWARABE_80x100x8_01_Futu.gif
「 机の個数をベースで☆」

#
# Note.
#
# Root directory: Visual studio code workspace root.
#
block_input_file = "./ascii-floor-map-to-csv/data/floor-map.txt"
table_input_file = "./ascii-floor-map-to-csv/data/table-number-map.txt"
output_file_name = "./ascii-floor-map-to-csv/auto-generated/floor-map.csv"

try:
    bl_file = open(block_input_file)
    try:
        ta_file = open(table_input_file)

        try:
            out_file = open(output_file_name, 'w', encoding='utf-8')

            # Column name, No space.
            out_file.write("ID,X,Y,CHAR\n")
            id_column = []
            x_column = []
            y_column = []
            block_column = []

            bl_lines = bl_file.readlines()
            for y, line in enumerate(bl_lines):
                for x, char in enumerate(line):
                    if char != '.' and char != '\n':
                        x_column.append(x)
                        y_column.append(y)
                        block_column.append(char)

            ta_lines = ta_file.readlines()
            for row in ta_lines:
                cols = row.split(",")
                for x, number_text in enumerate(cols):
                    num = int(number_text)
                    if num != 0:
                        id_column.append(num)

            # 机の個数をベースで。
            print("len(id_column   ):{}".format(len(id_column)))
            print("len(x_column    ):{}".format(len(x_column)))
            print("len(y_column    ):{}".format(len(y_column)))
            print("len(block_column):{}".format(len(block_column)))
            for i, char in enumerate(block_column):
                # print("i:{}".format(i))
                out_file.write("{},{},{},{}\n".format(
                    id_column[i], x_column[i], y_column[i], char))

        except Exception as e:
            print(e)
        finally:
            out_file.close()

    except Exception as e:
        print(e)
    finally:
        ta_file.close()
except Exception as e:
    print(e)
finally:
    bl_file.close()

print("Info    : Finished.")

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 じゃあ これで☆」

<おわり>

ツイッターでシェア
みんなに共有、忘れないようにメモ

むずでょ

光速のアカウント凍結されちゃったんで……。ゲームプログラムを独習中なんだぜ☆電王戦IIに出た棋士もコンピューターもみんな好きだぜ☆▲(パソコン将棋)WCSC29一次予選36位、SDT5予選42位▲(パソコン囲碁)AI竜星戦予選16位

Crieitは誰でも投稿できるサービスです。 是非記事の投稿をお願いします。どんな軽い内容でも投稿できます。

また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!

有料記事を販売できるようになりました!

こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください。
ボードとは?

コメント