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

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

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

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

VBScript

VBScript(Visual Basic Scripting Edition)はMicrosftが開発したスクリプト言語であり、Visual Basicのサブセットです。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

3回答

4361閲覧

UBound関数で-1が出力される

ka999

総合スコア9

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

VBScript

VBScript(Visual Basic Scripting Edition)はMicrosftが開発したスクリプト言語であり、Visual Basicのサブセットです。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2020/09/10 07:36

学習目的です。解説をお願いしたいです。

予想ではhairetu(3)(0)に改行(目には見えませんが)が入っていると思ったのですがエラーになりました。
UBound関数で確認すると-1が出力されます。UBound関数は最大のインデックス番号を出力すると思うのですが、-1はどういった意味なのでしょうか?
また、hairetu(3)(0)に改行(もしくは改行コードvbCrLf)を格納するにはどのような方法がありますか?

VBScript

1Dim hairetu 2hairetu = csvHairetuKakunou("test.csv") 'csvからジャグ配列に格納 3msgbox UBound(hairetu(3)) '-1と表示される 4 5msgbox hairetu(1)(2) '12と表示される 6'msgbox hairetu(3)(0) 'インデックスが有効範囲にありません。とエラーになる 7'msgbox hairetu(-1)(0) 'インデックスが有効範囲にありません。とエラーになる

下記でcsvファイルから配列に格納します。

VBScript

1Function csvHairetuKakunou(inFile) '戻り値にジャグ配列 2'csv形式のファイルジャグ配列に格納する。,区切り 3 'inFile:ファイルのパス 4 Dim fso 'ファイルを操作する準備 5 Set fso = WScript.CreateObject("Scripting.FileSystemObject") 6 Dim inputFile 7 Set inputFile = fso.OpenTextFile(inFile, 1, False) '読み取り専用でファイルを開く。 8 Dim Arr() 'データを格納する配列 9 Dim dataLine '一行のデータを一時的に入れる変数 10 Dim i 'ループ変数 11 i = 0 12 Do Until inputFile.AtEndOfStream 'ファイルの終端になるまで繰り返し 13 dataLine = inputFile.ReadLine 'ファイルを1行読み込んで次の行の先頭にポインタを移動。 14 Redim Preserve strArr(i) '動的配列の格納データを保持したまま最大インデックスiに変更 15 strArr(i) = Split(dataLine, ",") 'Split(文字列,区切り文字)文字列を区切り文字ごとに配列に格納する 16 i = i + 1 17 Loop 18 csvHairetuKakunou = strArr 19End Function

test.csv

100,01,02,03 210,11,12,13,14 320,21,22,23 4 540,41,42,43 650,51,52,53,54

上記test.csvファイル内です。間が空いてる部分は何もない改行です。

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

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

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

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

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

guest

回答3

0

他の回答のまとめみたいになってしまいますが。。。

-1は要素がない場合の戻り値です。
なぜ-1になるかというとReadLineは改行コードを含まず読み込むからです。
公式マニュアル

また、hairetu(3)(0)に改行(もしくは改行コードvbCrLf)を格納するにはどのような方法がありますか?

前述通りReadLineは改行コードを含みません。
よって空行ではない行の最終列は改行コードを含んでいません。
空行の時だけ改行コードのデータを作るのは、他の行とデータ構成が違ってしまいます。
改行コードのデータを作るのではなく、空要素のまま処理するか、空文字のデータ作る方が望ましいかと思います。

投稿2020/09/10 08:57

ttyp03

総合スコア17000

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

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

ka999

2020/09/10 09:12

>なぜ-1になるかというとReadLineは改行コードを含まず読み込むからです。 すごく納得です。 >他の行とデータ構成が違ってしまいます。 というのは、改行コードの種類が変わるってことですか?vbCrLf、vbCr、vbLfのような?もしくは別の何かがありますか?
ttyp03

2020/09/10 10:15

いえ、違います。 データがある行には改行コードがつきません。 それなのにあえて改行コードを埋め込むと、データがある行と整合性が取れなくなるということです。
ttyp03

2020/09/10 23:43

ちょっと誤解される書き方だったので訂正。 X データがある行には改行コードがつきません。 O ReadLineでの読み込みには改行コードがつきません。
ka999

2020/09/11 05:26

回答ありがとうございました。 空要素のまま処理する方向をメインに試してみようと思います。
guest

0

ベストアンサー

UBound が -1 を返すということは配列に要素がない(要素数0)という意味だと思います。

hairetu(3) はCSVの4行目なので、空文字列なので要素数0になります。

Split("",",")は要素数0の配列になります。

下記のコードを試してみてください。意味が分かると思います。

vbs

1ary1 = Split("",",") 2MsgBox UBound(ary1) '-1 要素数0の配列 3 4ary2 = Split(" ",",") 5MsgBox UBound(ary2) '0 要素数1の配列 6 7str = "" 8MsgBox UBound(str) '配列でないので型が違うというエラー 9

hairetu(3)(0)に改行(もしくは改行コードvbCrLf)を格納するにはどのような方法がありますか?

vbs

1'前略 2 3 dataLine = inputFile.ReadLine 4 If dataLine = "" Then dataLine = vbCrLf 5 Redim Preserve strArr(i) 6 strArr(i) = Split(dataLine, ",") 7 i = i + 1 8 9'後略

ttyp03さんの回答にあるようにこの行だけ改行コードを入れるのは、他の行との整合性がとれないので、あまりよくないですね。
要素数0のままにしておくか、空文字列の配列を格納するようにしたほうがいいですね。

vba

1'前略 2 3 dataLine = inputFile.ReadLine 4 Redim Preserve strArr(i) 5 If dataLine = "" Then 6 strArr(i) = Array("") 7 ELse 8 strArr(i) = Split(dataLine, ",") 9 End if 10 i = i + 1 11'後略

投稿2020/09/10 08:27

編集2020/09/11 00:20
hatena19

総合スコア34075

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

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

ka999

2020/09/10 08:34

回答ありがとうございます。 要素ゼロの時に-1よくわかりました。
radames1000

2020/09/11 00:06

内容については異論ないのですが最初のvbsの誤記だけ MsbBox⇒MsgBox 最後のUBound(ary2)はUBound(str)だと思います。
hatena19

2020/09/11 00:18

あ、ミスってますね(汗) ご指摘ありがとうございます。 修正して置きます。
ka999

2020/09/11 04:09

わかりやすく、丁寧に解説していただけていたのでベストアンサーにさせていただきます。また、ほかの方の回答、コメントも合わせて参考にさせていただきます。
guest

0

ここは

VBA

1msgbox UBound(hairetu(3)) '-1と表示される

こうだと思います。

VBA

1msgbox UBound(hairetu)

Uboundは要素がなければ-1を返すはずです。
参考になるところを探そうと思いましたが本日は時間切れです。
⇒他の方が詳しく書かれていますのでそちらをご確認ください。

投稿2020/09/10 07:54

編集2020/09/11 00:25
radames1000

総合スコア1925

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

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

ka999

2020/09/10 08:09

回答ありがとうございます。 ```VBScript msgbox UBound(hairetu) '5と表示される ``` 表示されるのは5でした。今回の例だとtest.csvの縦の最大インデックス番号の5が表示されていると考えています。 よろしければ、test.csvの間の空いた部分を指す(のかな?)、-1の意味を解説していただきたいです。よろしくお願いします。
ka999

2020/09/10 08:28

追記ありがとうございます。 >Uboundは要素がなければ-1を返すはずです。 とのことでこちらでももう少し調べてみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問