• 締切済み

【再】MATLABのcsvreadについて

前回質問させて頂いたのですが、意味が分からないとの指摘を 頂きましたので、再度質問させていただきます。 何度も申し訳ないですが、ご存知の方がいらっしゃいましたら教えて下さい。 私がやりたいのは、CSV形式のファイル名を入力すると MATLABさんが入力されたファイル名を読み取って グラフを表示するといったことがしたいのです。 (フォルダ内にたくさんあるCSVファイルから、好きなのを選びたい) そのため、私はcsvreadの引数であるファイル名を変数として みましたが、文字列じゃないとダメだと怒られます。 下記に私の書いたものをそのまま載せますので、ダメな点を指摘していただければと思います。 <<Mファイル>> Prompt = {'対象文字','Figure Number '}; Title = 'Dialog'; Def={'A','1'}; set_Dialog = inputdlg(Prompt,Title,1,Def); filename1 = strcat(set_Dialog(1,1),'_1.csv'); filename2 = strcat(set_Dialog(1,1),'_2.csv'); fig_num = set_Dialog(2,1); ↓ここからわかりません。↓ >>xy = csvread(filename); ??? エラー ==> csvread の 32 行目ファイル名は文字列でなければなりません。 >>xy = csvread('filename2'); ??? エラー ==> csvread の 38 行目ファイルが見つかりません

みんなの回答

  • sgwjn
  • ベストアンサー率70% (47/67)
回答No.3

#2です。 訂正と追記です。 訂正 × xy = csvread(char(filename)); ○ xy = csvread(char(filename1)); 追記 おそらく、 fig_num = set_Dialog(2,1); もdouble型として受け取れていないと思います。

c-beginer
質問者

お礼

ありがとうございます。 できましたぁ!!! おっしゃられる通り、Cell型でした。 自然にchar型になると思ってました。 本当にありがとうございます。

  • sgwjn
  • ベストアンサー率70% (47/67)
回答No.2

これはおそらく、inputdlg関数の戻り値がcell型だからだと思います。 対処方法としては、以下の2つが考えられます。 (1)filename1 = strcat(set_Dialog{1,:},'_1.csv'); (2)xy = csvread(char(filename)); また、任意のフォルダから任意のファイルを選択するのであれば、uigetfile関数を使う方が良いと思います。

  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.1

>>>xy = csvread(filename); >??? エラー ==> csvread の 32 行目ファイル名は文字列でなければなりません。 filename1が正しいですか? 最後の1が抜け落ちているように見えます。 >>>xy = csvread('filename2'); >??? エラー ==> csvread の 38 行目ファイルが見つかりません 「filename2」という名前のファイルが見つからない、といっています。 ''で囲む必要があるのでしょうか?

c-beginer
質問者

補足

御回答ありがとうございます。 >最後の1が抜け落ちているように見えます。 記載中に消してしまったようです。 実際は、下記のように書いていますが同様のエラーがでます。 >>xy = csvread(filename1); ??? エラー ==> csvread の 32 行目ファイル名は文字列でなければなりません。 >>>xy = csvread('filename2'); これは、文字列文字列とうるさいので、文字列で書いて見たものです。 当たり前のエラーですね。。。 実際は、filename2の中にある、'A_2.csv'を読み込みたいのですが。

関連するQ&A

  • MATLABでのcsvreadで困っています。

    はじめして。 MATLABの記述方法についての質問です。 Filename = strcat(set_Dialog(1,1),'.csv'); として、Filenameをダイアログから入力できるようにできるようにしました。 ところが、csvread('ファイル名')の引数を文字列として認識させる方法が分かりません。 ご存知の方がいらっしゃいましたら、教えて下さい。 よろしく御願いいたします。

  • MATLAB(マトラボ)とcsvファイルについて

    マトラボで、文字列を含む、csvファイルを読み込み、データをプログラムに使用したいのですが、どうしたらいいですか? csvread('filename')ではできませんでした。 どなたか、ご教授くださいませ。

  • perlでのcsv形式のテキストファイルの変換

    perlを使用してcsv形式のテキストファイルを下記のように変換したいと思っています。 【変換前】 10, abc , def , ghi ,jkl    ----1行目 10, abc , def , aaa, bbb   ----2行目 10, abc , def , ccc , ddd  ----3行目 11, abc , def , eee , fff   ----4行目 11, abc , def , aaa , ggg ----5行目 11, zzz , def , aaa , ggg  ----6行目 12, abc , def , aaa ,ggg ----7行目 12, zzz , def, aaa , ggg   ----8行目 【変換後】 10, abc , def , ghi ,jkl    ----1行目 11, abc , def , eee , fff   ----4行目 11, zzz , def , aaa , ggg  ----6行目 12, abc , def , aaa ,ggg ----7行目 12, zzz , def, aaa , ggg   ----8行目 変換内容はcsv形式のテキストファイルで、”,”で区切った先頭3列が 前の行の先頭3列と同じならその行は出力しない、といった 変換をしたいと思っております。 (例えば2行目ですと先頭3列は10, abc ,defになっており、  1行目の先頭3列と同じ文字列になっているためこの行は出力しない) 当方、Perl初心者で上記のようなことがPerlでできるかも よくわかっておりません。 そこで、上記のような変換はPerlで可能なのか、そしてもし可能であるのなら どのようにPerlで記述すればできるのか教えていただけないでしょうか。 よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • bashスクリプトでのテキストの検索・置換について

    下記のような形式のテキストファイルがあります。 []で囲まれた部分の文字列(セクション名)はわかっています。 各セクションの間には空行があることもあれば無いこともあります。 各セクションの記載順序は不定です。 各セクションの中の記載順も不定です。 各セクションの中の行数も不定です。 別々のセクションに同じ行があり得ます。 この場合に、bashスクリプトの中で、[def]セクションの文字列cccをccdに置き換えるにはどのような方法があるでしょうか。 awkでできるような気がするのですが、 awk '/\[def\]/{BEGINNUM = NR}' FILENAME とすれば BEGINNUM にセクションの始まりを取得できるものの、セクションの終わりの行番号の取得がわかりません。 [def]行の後に最初に出てくる[]の付いた行を検出すればよいのですが、特定の行以降で最初に出てくる文字列の行を検索するのはどうすればよいでしょうか。 あるいは、まったく異なった方法があるでしょうか。 (対象テキストファイル) [abc] aaa bbb ccc [def] aaa ccc bbb ddd [ghi] aaa eee bbb ccc (テキストファイル終了) 2007年3月25日

  • MATLABのCSV形式での書き込みについて

    MATLABにて計算させた結果をCSV形式で出力したいのですが, もともとCSVファイルに書き込んであるデータを消さずに, 追加書き込みとして,行と列を指定して書き込み出来るのでしょうか? もしできるのであれば, どのようなプログラムを組めばよいのでしょうか? どなたかご教授お願いします.

  • MATLABのCSV形式での書き込みについて

    MATLABにて計算させた結果をCSV形式で出力したいのですが, もともとCSVファイルに書き込んであるデータを消さずに, 追加書き込みとして,行と列を指定して書き込み出来るのでしょうか? もしできるのであれば, どのようなプログラムを組めばよいのでしょうか? どなたかご教授お願いします.

  • 複数CSVファイルからデータ抽出

    CSVファイルのA列(行は問いません)の文字が転記シートのA列(行は問いません)と一致していたら、転記シートのA列が一致した行の空白に、左から順にCSVファイルのA列が一致した行のF列の値を書き込む。CSVファイルの1行A列を転記シートのF列の値を書き込んだ列の1行目に書き込む。 できれば、書き込んだ値はCSVファイルから消したいです。 コピペでやっていたのですが、ずれていてどうしようもなくなりました。 CSVファイル一つ当たり、4000行ほどあり、ファイルは200弱あります。 プログラムを組んでくださると、ありがたいのですが。 質問というよりお願いになってしまいますが、よろしくお願いします。

  • 複数あるファイルの中から同じ文字列を含むファイルのみを選別させて開くには

    下記の通り同じフォルダーの中にある複数あるファイルを全部開くマクロはわかるのですが同じ文字列を含むファイルのみを自動選別させて開くにはどうすればいいのでしょうか? 具体的には"AAA-1" "AAA-2"のように"AAA-"を含む文字列のあるファイルは開きBBB-1"や"CCC-2"等文字列の含まないファイルは開かないようにしたいのですが。。アドバイスよろしくお願いいたします。 CSVFile = CurDir() FileName$ = Dir( CSVFile & "\*.csv", vbNormal) Do While FileName$ <> "" Workbooks.Open Filename:=FileName$ ・ ・ loop

  • VBS 複数ファイル複数行を配列格納

    ある配下のCSVファイル2個(固定)を読み込み、 コンピュータ名の列が同じ行を比較するというツールを作っています。 考えた結果以下まではできましたが、どうしても指定行を配列に埋め込み処理ができません。 比較方法はわかります。 ですが以下のプログラムでは、CSVの行は複数行あるので最終行しか格納されません。 どのようにしたら、2つのCSVファイルそしてすべての行を配列に入れ込むことができるのでしょうか。 For Each FileName In src.Files FileEx = fso.GetExtensionName(FileName) If LCase(FileEx) = "csv" Then Set CsvFile = fso.OpenTextFile(FileName) Do Until CsvFile.AtEndOfStream tmpLine = CsvFile.ReadLine If roopCnt = 0 Then '1個目のCSV ArrayA = Split(tmpLine,",") Else '2個目のCSV ArrayB = Split(tmpLine,",") End rowCnt = rowCnt +1 Loop roopCnt = 1 End If Next

  • このようなエクセルマクロを作りたいのですが・・・

    ,で区切られたasc形式のファイルを、エクセル上に出力したいです。 ファイルは大体12万行くらいあります。 やりたいこと) 1. 任意のファイルを読み込む。 2. ,毎に区切って「数値」として出力する。(,は2つあるので、データはABC列に出力されることになります) 3. 32000行を越えたら、DEF列に出力する。 4. DEF列でも再び32000行(合計64000行読み込んだ)を越えたらGHI列に・・・ 5.データがなくなったら終了 ということがやりたいです。 現在、ファイルを読み込んで区切るところまでは出来たのですが、3のところで躓いています。ソースを書いておきますので、どのようにやればいいのでしょうか? 途中で、IF Rowcnt > 32000 then・・・とやると上手くいきそうなのですが、様々なエラーに阻まれてお手上げです・・・ また、このマクロで出力すると、必ず「文字列」として出力されてしまうのですが、どうやれば最初から「数値」として出力してくれるのでしょうか?どこか宣言を誤ったのでしょうか・・・ つたない文章ですが、ご指導のほどよろしくお願いいたします。 Sub CSV_Read() Dim FileType, Prompt As Variant Dim FileNamePath As Variant Dim csvline() As String Dim i, Rowcnt, ColumNum As Integer Dim ch1 As Variant FileType = "asc ファイル (*.asc),*.asc" Prompt = "ファイルを選択してください" FileNamePath = SelectFileNamePath(FileType, Prompt) If FileNamePath = False Then End End If ColumNum = GetItemNum(FileNamePath) '1行あたりの項目数を取得します ReDim csvline(1 To ColumNum) 'csvlineを1行あたりの項目数で再割り当て ch1 = FreeFile Open FileNamePath For Input As #ch1 'FileNamePath のファイルをオープンします On Error GoTo CloseFile Rowcnt = 1 Do While Not EOF(ch1) 'ファイルの終端かどうかを確認。 For i = 1 To ColumNum Input #ch1, csvline(i) '1行の項目数だけ読み込み Next Range(Cells(Rowcnt, 1), Cells(Rowcnt, ColumNum)) = csvline() Rowcnt = Rowcnt + 1 Loop CloseFile: Close #ch1 End Sub

専門家に質問してみよう