質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
Julia

Juliaとは、科学技術計算に特化した、高水準・高性能な動的プログラミング言語です。オープンソースとして公表されており、書き易く動きが早いことが特徴です。

Q&A

解決済

3回答

501閲覧

テキストファイルを読み込み、配列に格納したい。

sobagiku

総合スコア2

Julia

Juliaとは、科学技術計算に特化した、高水準・高性能な動的プログラミング言語です。オープンソースとして公表されており、書き易く動きが早いことが特徴です。

0グッド

0クリップ

投稿2023/12/14 14:32

実現したいこと

ここに実現したいことを箇条書きで書いてください。

  • テキストを読み込み、配列に格納したい

前提

別のプログラムで生成されていた配列をテキストファイルに保存したものがあるのですが、それを改めて別のプログラムで読み込み、配列にしようとしていました。

テキストファイルは以下のように配列の行ごとに[ ]で囲まれて保存されています。実際には50×80の配列です。
[1.0, 1.0, 0.0, 1.0]
[2.0, 3.0, 1.0, 1.0]
[1.0, 3.0, 1.0, 0.0]

発生している問題・エラーメッセージ

以下のソースコードで得られたAを別の50×80の場所に代入しようとしていたのが、51×1になっているためダメだと言われました。おそらく各行を1マス?として詰めて全ての行を1次元の配列にしてしまっているのだと思います。本来は、改行記号ごとに行を分けて、カンマごとに要素を分けたかったです。

ERROR: LoadError: DimensionMismatch: tried to assign 51×1 array to 50×80 destination

該当のソースコード

Julia

1A = open("test.txt") do file 2 content = read(file,String) 3 cleaned_content = replace(content, r"[ \[\]]" => "") 4 lines = split(cleaned_content, "\n") 5 lines_data = [[parse(Float64,x) for x in split(line, ",") if x ""] for line in lines] 6 lines_data 7 end

試したこと

それぞれの行の中身を分けようとparse()を使ったりしたが、ベクトルには使用できないという意味だと思われるエラーが起きた。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

今回の場合は Matrix の方がよい様に思います。

julia

1A = mapreduce(vcat, readlines("test.txt")) do line 2 (parse.(Float64, split(line[2:end-1], ",")))' 3end 4show(stdout, "text/plain", A) 5 6# 3×4 Matrix{Float64}: 7# 1.0 1.0 0.0 1.0 8# 2.0 3.0 1.0 1.0 9# 1.0 3.0 1.0 0.0

投稿2023/12/14 16:29

melian

総合スコア20574

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sobagiku

2023/12/14 21:46

すいません、Julia初心者で文法がわからないのですが, "do line ... end"の "line"はどのような意味で書いてあるのでしょうか。 通常の "do ... end"とは違うのでしょうか。 それともdoとlineは分けて読むものですか?
melian

2023/12/14 23:47

mapreduce も含めて読みます。 mapreduce ... do line .. end test.txt の各行(readlines)が line に割り当てられて do .. end の中身(parse.(...))が実行されます。(map処理) 最終的に vcat で Matrix に変換されることになります。(reduce処理)
sobagiku

2023/12/15 00:19

理解できました! 詳しく教えていただきありがとうございました。
guest

0

蛇足ですが,]改行[; , に変えてから
禁断のMeta.parseevalのコンボを使うという剛腕な方法もありそうです。

julia

1A = replace(read("test.txt", String), 2 "," => " ", r"\][^\[]+\[" => "; ") |> Meta.parse |> eval

Meta.parseは文字列がJulia言語の構文に合致しているかどうかを解析し,
エラーが出なければ,その結果をevalに通すとJuliaの実行結果として得られます。

例示したソースではreplaceを使って文字列全体をMatrixの記述に合わせてから,Juliaのプログラムの実行結果としてMatrixの結果を得ています。

メタプログラミングといって,プログラムでプログラム自体を書き換えるような
目的で使われる手法で,通常あまり利用してはいけないと言われている方法です。

a |> bの記述方法は b(a)の別の書き方です。

Julia言語は色々な書き方ができますね。

投稿2023/12/21 17:20

ujimushi_sradjp

総合スコア2150

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

改行で分割しましょう。                     1

投稿2023/12/15 00:32

Hello1002

総合スコア15

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問