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

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

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

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

多次元配列

1次元配列内にさらに配列を格納している配列を、多次元配列と呼びます。

VBScript

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

配列

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

Q&A

解決済

3回答

5948閲覧

VBSで、CSVをテキスト形式で編集(列挿入)する方法

mikan_p

総合スコア1

CSV

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

多次元配列

1次元配列内にさらに配列を格納している配列を、多次元配列と呼びます。

VBScript

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

配列

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

0グッド

0クリップ

投稿2021/08/07 04:54

編集2021/08/07 09:37

#VBSでCSVを編集する方法について
VBS初心者です。
業務でVBSの作成が必要なため、手探り状態でコードを書いております。
一部、処理が上手くいかずに行き詰っているところがあるため、
以下の内容について、知識がある方にご教授いただければと思っております。

実現したいこと

csvをテキスト形式で開き、17列あるリストの15列目・16列目に新しく2列を挿入したい。
挿入した列の1行目のみ、15列目に文字列"レンタル"を入れ、16列目に文字列"プラン名"を挿入、
2行目以降は15列目16列目には文字列を入力せず空白(列追加のみの状態)にしたい。
この処理をVBSにて実行したい。

CSVの状態

・元のcsvの状態

|列1|列2|列3|列4|列5|列6|列7|列8|列9|列10|列11|列12|列13|列14|列15|列16|列17|
| あ | い| う| え | お| か | き | く | け | こ | さ | し | す | せ | そ | た | ち |
| : | : | : | : | : | : | : | :  | :  | : | : | :  | :  | :  | :  | :  |
| : | : | : | : | : | : | : | :  | :  | : | : | :  | :  | :  | :  | :  |
| : | : | : | : | : | : | : | :  | :  | : | : | :  | :  | :  | :  | :  |
:
:

・実現したい列挿入後のcsvの状態

   |列1|列2|列3|列4|列5|列6|列7|列8|列9|列10|列11|列12|列13|列14| 列15 | 列16 |列17|列18|列19|
| あ| い | う| え | お| か| き | く | け | こ | さ | し | す | せ |レンタル|プラン名| そ | た | ち |
| : | : | : | :| : | : |: | :  | : | : | : | :  | :  | :|    |     | : |  : |  : |
| : | : | : | :| : | : |: | :  | : | : | : | :  | :  | :|    |     | : |  : |  : |
| : | : | : | :| : | : |: | :  | : | : | : | :  | :  | :|    |     | : |  : |  : |
:
:  

以下のソースコードでできていること

・1行目の列15,16にそれぞれ、文字列"レンタル"、"プラン名"を挿入してCSVを出力。

以下のソースコードでできないこと

・2行目以降にも列追加(空白のまま)をしたいが、できていない。
・多次元配列にして2行目以降にも列挿入し、2行目以降は空白を挿入する分岐処理を行うことが必要かと思っているが、配列に関する知識も乏しく、方法が分からない。

試したこと(ソースコード)

コードの表示(インライン)

VBScript

1コードの表示(ブロック) 2Option Explicit 3 4Dim objFile 5Dim strLine 6Dim strLineSplited 7Dim j 8Dim k 9Dim i 10Dim data 11Dim objwriteFile 12Dim objwriteFso 13Dim inputcsv 14Dim outputcsv 15 16'列を追加する位置と、文字列を定義 17 18'追加位置①(インデックス) 19Const add1 = 14 20 21'追加位置②(インデックス) 22Const add2 = 15 23 24'追加文字列① 25Const rental_Prace = "レンタル" 26 27'追加文字列② 28Const plan_Name = "プラン名" 29 30 31'格納ファイルの文字コードを指定 32Set inputcsv = CreateObject("ADODB.Stream") 33inputcsv.Type = 2 34inputcsv.Charset = "shift_jis" 35inputcsv.Open 36 37'出力ファイルの文字コードを指定 38'Set outputcsv = CreateObject("ADODB.Stream") 39'outputcsv.Type = 2 40'outputcsv.Charset = "shift_jis" 41'outputcsv.Open 42 43'ファイルシステムオブジェクト定義 44 Dim objFSO 45 Set objFSO = WScript.CreateObject("Scripting.FileSystemObject") 46'フォルダパス 47 Dim objPath 48 Const strFolder = "C:\temp\test" 49 If objFSO.FolderExists(strFolder) = False Then 50 Set inputcsv = Nothing 51 WScript.Quit 52 End If 53 Set objPath = objFSO.GetFolder(strFolder & "\") 54 55For Each objFile In objPath.Files 56 Dim FileName 57 FileName = objFile.Name 58 59 If InStr(FileName, "番号") > 0 Then 60 '文字列の中に"16"の文字が無いcsvで以下の処理が行われます。 61 If InStr(FileName, "(16)") = 0 Then 62 63 inputcsv.LoadFromFile objPath & "\" & FileName 64 65 j = 1 66 67 Do Until inputcsv.EOS 68 '1行ずつ読み取り、strLineに格納 69 70 strLine = inputcsv.ReadText(-1) 71 WScript.Echo strLine 72 strLineSplited = Split(strLine, ",") 73 74 '配列を一つ増やす 75 ReDim Preserve strLineSplited(UBound(strLineSplited) + 2) 76 77 '配列末尾から追加位置まで順番に置換① 78 For i = UBound(strLineSplited) To ADDprace + 1 Step -1 79 strLineSplited(i) = strLineSplited(i - 1) 80 Next 81 82 '配列末尾から追加位置まで順番に置換② 83 For i = UBound(strLineSplited) To add_planname + 1 Step -1 84 strLineSplited(i) = strLineSplited(i - 1) 85 Next 86 87 '指定位置を置換① 88 strLineSplited(add1) = rental_Prace 89 90 '指定位置を置換② 91 strLineSplited(add2) = plan_Name 92 93 j=ubound(strLineSplited) 94 95 if j<>-1 then 96 for k=0 to j 97 data = data & strLineSplited(k) & "," 98 next 99 End If 100 101 '出力ファイルの文字コードを指定 102 Set outputcsv = CreateObject("ADODB.Stream") 103 outputcsv.Type = 2 104 outputcsv.Charset = "shift_jis" 105 outputcsv.Open 106 outputcsv.WriteText data, 1 107 108 109 Loop 110 '出力ファイルを、格納ファイルと同じファイル名で保存 111 outputcsv.SaveToFile "C:\temp\test\test1.csv", 2 112 113 End If 114 End If 115 116Next 117 118inputcsv.Close 119outputcsv.Close 120 121Set objFSO = Nothing 122Set inputcsv = Nothing 123Set outputcsv = Nothing 124 125 126 127

ご教授いただきたいこと

上記のソースコードに、どのようなコードを追加すれば処理が実現できますでしょうか。
お知恵のある方いらっしゃいましたら、ご教授いただけると幸いです。
よろしくお願いいたしますm(__)m

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

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

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

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

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

YT0014

2021/08/07 09:03

タグVBAは、VBScriptとは異なる言語ですので、タグから外すことをお勧めします また、ソースコードですが、'''の直後は、言語を指定する場所なので、HTMLからVBScriptにされたほうが良いのではないでしょうか。
guest

回答3

0

こんな感じでどうでしょうか。

VBS

1 '出力ファイルの文字コードを指定 2 Set outputcsv = CreateObject("ADODB.Stream") 3 outputcsv.Type = 2 4 outputcsv.Charset = "shift_jis" 5 outputcsv.Open 6 7 Dim lineNo 8 lineNo = 0 9 10 Do Until inputcsv.EOS 11 '1行ずつ読み取り、strLineに格納 12 lineNo = lineNo + 1 13 strLine = inputcsv.ReadText(-2) 14 'WScript.Echo strLine 15 strLineSplited = Split(strLine, ",") 16 17 '配列を一つ増やす 18 ReDim arr(UBound(strLineSplited) + 2) 19 20 For i = 0 To add1 - 1 21 arr(i) = strLineSplitted(i) 22 Next 23 If lineNo = 1 Then 24 arr(add1) = rental_Prace 25 arr(add2) = plan_Name 26 End If 27 For i = add2 + 1 To UBound(arr) 28 arr(i) = strLineSplitted(i - 2) 29 Next 30 31 Data = Join(arr, ",") 32 outputcsv.WriteText Data, 1 33 Loop 34 '出力ファイルを、格納ファイルと同じファイル名で保存 35 outputcsv.SaveToFile objPath & "\" & FileName, 2 36 outputcsv.Close 37 38

投稿2021/08/07 09:02

編集2021/08/07 09:40
jinoji

総合スコア4585

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

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

mikan_p

2021/08/07 12:20

丁寧なご回答ありがとうございます。 コード参考にさせていただきます。 ReadText(-1)にしておりましたが、ReadText(-2)で行ごとに読み取って 改行処理を加えることで解決いたしました! ありがとうございましたm(__)m
guest

0

列を入れ替えたいわけでもなく、欲しい結果がCSVなら配列に入れ直す必要もなく、そのまま出力した方が早くないですか?

VBA

1Dim readCols As Variant 2Dim c As Long ' 現在のカラム番号管理用 3Dim addIdx1 As Long 4Dim addIdx2 As Long 5Dim addCol1 As String 6Dim addCol2 As String 7 8addIdx1 = 14 9addCol1 = "レンタル," 10 11addIdx2 = 15 12addCol2 = "プラン," 13 14' ファイルオープンのゴニョゴニョ。 15 16Do ' この辺で strLine に1行ずつ読み込む 17 18 readCols = Split(strLine, ",") 19' readColsの要素数が足りていない場合のエラーチェックは省略 20 21 c = 1 ' 最初のカラムは 1 22 For i = LBound(readCols) to UBound(readCols) 23' 最後のカラムの後ろにコンマは要らないとかは気にしてない 24 data = data & readCols(i) & "," 25 c = c + 1 26 27' 挿入するカラムの処理 28 If c = addIdx1 Then 29 data = data & addCol1 30 c = c + 1 31 End If 32 33 If c = addIdx2 Then 34 data = data & addCol2 35 c = c + 1 36 End If 37 Next 38' ヘッダ行以外はスペースを追加。2行目以降これが毎回実行されるけれど、この程度なら実害はない 39 addCol1 = " ," 40 addCol2 = " ," 41 42' 1行分のデータ出力処理をどうするかは省略 43Loop 44 45' ファイルに保存。 46

投稿2021/08/07 06:31

ishina_yum

総合スコア509

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

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

mikan_p

2021/08/07 12:17 編集

丁寧なご回答ありがとうございます。 多次元配列に格納する必要があるのかと思っておりましたが、 ReadText(-2)で行ごとに読み取って改行すると上手くいきました。 ありがとうございましたm(__)m
guest

0

ベストアンサー

長いので、部分的にしか読んでませんが、

strLine = inputcsv.ReadText(-1)

は、行単位で読むならReadText(-1)じゃなくてReadText(-2)では?

投稿2021/08/07 05:08

otn

総合スコア84421

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

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

mikan_p

2021/08/07 06:24

ご回答いただきありがとうございます。 ReadText(-1)だと行ごとに改行されたまま出力されるのですが、 ReadText(-2)にすると、処理自体はできるのですが行ごとに 改行されないまま出力されてしまいます…
otn

2021/08/07 08:11 編集

改行を出力しないと改行されないのは当たり前です。 適切な箇所で改行を付加しましょう。 1行ずつ読み込むことと、ファイル全部まとめて読み込むことの違いを理解しましょう。
mikan_p

2021/08/07 09:42

ReadText(-2)として行ごとに改行すればできました! 単純なところ難しくとらえておりました… ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問