いつもお世話になっております。
VBScriptを使用して、下記のようなCSVをメールアドレスごとに別々のテキストファイルに書き出したいです。
都道府県名, 担当ブロック名, 担当者名, 電話番号, メールアドレス, ・・・
北海道, 1ブロック, 佐藤 浩二, 090-0000-0001, kjsato@aaa.co.jp
北海道, 2ブロック, 田中 洋子, 090-0000-0002, yktanaka@aaa.co.jp
北海道, 3ブロック, 佐藤 浩二, 090-0000-0001, kjsato@aaa.co.jp
北海道, 4ブロック, 石川 隆, 090-0000-0003, tkshishikawa@aaa.co.jp
(以下略)
上記でいえば、1ブロックと3ブロック担当の佐藤さんのレコードを1つのファイルにまとめて出力。
それ以外の方はそれぞれ別ファイルに出力。
ADODBコネクションを使用するところまでは、なんとなくわかります。
次はメールアドレスをキーにして、SQLで出力、ですかね。。
すみませんが、どなたか具体的な方法をご教示いただけないでしょうか。
以上、よろしくお願いいたします。
No.5ベストアンサー
- 回答日時:
以下のスクリプトを実行してください。
ファイル名は、あなたの環境に合わせてください。---------------------------------------------
Option Explicit
Dim objFileSystem
Dim objStream
Dim objStream2
Dim strLine
Dim arrFields
Dim mailaddr
Dim header
Dim line()
Dim lineNo
Dim dataNo
Dim datanos
Dim i
Dim mailList
Set mailList = CreateObject("System.Collections.SortedList")
Set objFileSystem = CreateObject("Scripting.FileSystemObject")
Set objStream = objFileSystem.OpenTextFile("d:\goo\vbs\goo2.csv", 1)
Set objStream2 = objFileSystem.OpenTextFile("d:\goo\vbs\result.csv", 2,true)
lineNo = 0
dataNo = 0
Do Until objStream.AtEndOfStream
strLine = objStream.ReadLine
if LineNo = 0 then
header = strLine
else
arrFields = Split(strLine,",")
mailaddr = arrFields(4)
redim preserve line(dataNo)
line(dataNo) = strLine
if mailList.ContainsKey(mailaddr) then
mailList.Item(mailaddr) = mailList.Item(mailaddr) & "," & dataNo
else
mailList.add mailaddr,dataNo
end if
end if
dataNo = dataNo + 1
lineNo = lineNo + 1
Loop
For i =0 To mailList.Count-1
objStream2.WriteLine("")
objStream2.WriteLine(header)
mailaddr = mailList.GetKey(i)
datanos = Split(mailList.Item(mailaddr),",")
For Each dataNo in datanos
objStream2.WriteLine(line(CLng(dataNo)))
next
Next
objStream.Close
objStream2.Close
Set objStream = Nothing
Set objStream2 = Nothing
Set objFileSystem = Nothing
Set mailList = Nothing
---------------------------------------------------------
以下、実行結果です。
goo2.csvの内容
------------------------------
都道府県名, 担当ブロック名, 担当者名, 電話番号, メールアドレス, ・・・
北海道, 1ブロック, 佐藤 浩二, 090-0000-0001, kjsato@aaa.co.jp
北海道, 2ブロック, 田中 洋子, 090-0000-0002, yktanaka@aaa.co.jp
北海道, 3ブロック, 佐藤 浩二, 090-0000-0001, kjsato@aaa.co.jp
北海道, 4ブロック, 石川 隆, 090-0000-0003, tkshishikawa@aaa.co.jp
------------------------------
result.csvの内容
-----------------------------
都道府県名, 担当ブロック名, 担当者名, 電話番号, メールアドレス, ・・・
北海道, 1ブロック, 佐藤 浩二, 090-0000-0001, kjsato@aaa.co.jp
北海道, 3ブロック, 佐藤 浩二, 090-0000-0001, kjsato@aaa.co.jp
都道府県名, 担当ブロック名, 担当者名, 電話番号, メールアドレス, ・・・
北海道, 4ブロック, 石川 隆, 090-0000-0003, tkshishikawa@aaa.co.jp
都道府県名, 担当ブロック名, 担当者名, 電話番号, メールアドレス, ・・・
北海道, 2ブロック, 田中 洋子, 090-0000-0002, yktanaka@aaa.co.jp
--------------------------------------------------------
回答ありがとうございます。
は~、CSV処理 = ADODBコネクション、だとばかり考えていましたが。。
まだまだ勉強が不足しているようです。
あまり見慣れないプロパティ(かな?)も多く書かれているので
いろいろテストしながら理解を深めていきたいと思います。
この度はありがとうございました。
No.4
- 回答日時:
>VBScriptを使用して、下記のようなCSVをメールアドレスごとに別々のテキストファイルに書き出したいです。
何か話が違う方向に行ってしまったようです。
それなら、それで、フィードバックは不要です。
それそれのメールアドレスに分類して出しますが、メールアドレスをもとにファイル名にしました。ただし、メールアドレスそのものがファイル名には使えませんので、エラーが発生する可能性はないとは言えません。例:abcd@aaa.co.jp <-> abcd@aaa.com コンフリクトします。
'-----SortedList.vbs ----
Dim DataList
Dim objFs
Dim objText
Dim Fname
Dim i, j, k
Const mPATH ="C:\Temp\Test1\" 'パス
Fname = mPATH & "myData2016.csv" 'ファイル名
Set DataList = CreateObject("System.Collections.SortedList")
Set objFs = CreateObject("Scripting.FilesystemObject")
Set objText = objFs.OpenTextFile(Fname)
buf = objText.ReadAll
arbuf = Split(buf, Chr(10))
For i = 1 To UBound(arbuf)
buf = Split(arbuf(i), ",")
If UBound(buf) > 3 Then
a = arbuf(i)
b = Trim(buf(4))
k = DataList.ContainsKey(b)
If k = False Then
DataList.Add b, a
Else
j = DataList.IndexOfKey(b)
c = DataList.GetbyIndex(j)
DataList.SetByindex (j), c & vbCrLf & a
End If
End If
Next
objText.Close
For i = 0 To DataList.Count -1
a = DataList.GetKey(i)
t= Replace(a,"@","-")
t = Mid(t,1,InStr(1,t,".")-1)
Set objText =objFs.CreateTextFile(mPATH & t & ".txt")
b = DataList.GetbyIndex(i)
objText.WriteLine( b)
objText.Close
Next
DataList.clear
WScript.Echo "finish!"
すごいですね。いきなり来てコードを書いてくださるなんて。
あなたにはスピードとパワーを感じました。
また、普段みなれないプロパティ(いや、メソッド、かな)を使用してくださっているので、
(Getkey()とか、GetbyIndex()とか)非常に勉強になります。
本当に感謝です。ありがとうございます。
No.3
- 回答日時:
>はい、ソートして・・。
可能であれば、メールアドレスごとに改行とヘッダーを入れたかったのですが、その部分の処理をどうかけばいいのかがよくわかっていません。といいことは、以下のような形でresult.csvが出力されれば良いのでしょうか?
-----------------------------------------------------------------------------------
(改行)
都道府県名, 担当ブロック名, 担当者名, 電話番号, メールアドレス, ・・・
北海道, 1ブロック, 佐藤 浩二, 090-0000-0001, kjsato@aaa.co.jp
北海道, 3ブロック, 佐藤 浩二, 090-0000-0001, kjsato@aaa.co.jp
(改行)
都道府県名, 担当ブロック名, 担当者名, 電話番号, メールアドレス, ・・・
北海道, 4ブロック, 石川 隆, 090-0000-0003, tkshishikawa@aaa.co.jp
(改行)
都道府県名, 担当ブロック名, 担当者名, 電話番号, メールアドレス, ・・・
北海道, 2ブロック, 田中 洋子, 090-0000-0002, yktanaka@aaa.co.jp
-------------------------------------------------------------------------------------
No.2
- 回答日時:
No1です。
そうすると、結果的には、
そのCSVファイルを第5列目(メールアドレス)でソートしたものをresult.txtへ
出力すれば良いということになりますが、それで間違いないでしょうか?
No.1
- 回答日時:
補足要求です。
質問1:1つのメールアドレスにつき、1つのファイルへ出力ですか?
その場合のファイル名は、どのようにするのですか?
例えば data1.csv data2.csv data100.csvのように連番で良いのですか?
質問2:出力ファイルのフォーマットは入力ファイルと同じで良いですか?
例
北海道, 2ブロック, 田中 洋子, 090-0000-0002, yktanaka@aaa.co.jp
質問3:kjsato@aaa.co.jpをもつ行は2行ありますが、どちらを採用しますか?
最初の行でしょうか、それとも、最後の行ですか、それとも、2行とも出力しますか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
彼氏を勢いでブロックして後悔...
-
ラインでブロックした覚えのな...
-
LINEをすぐブロックする人って...
-
女性がLINEをブロックするのは...
-
アプリで会う約束してたのに、...
-
私は45です。 Gravityで知り合...
-
元カノのLINEをブロック解除す...
-
凄い困ってます。 別れた元カノ...
-
学生時代の友人と縁を切りたい...
-
話さなくなった人のLINEって皆...
-
付き合ってない好きな人を忘れ...
-
LINEってよっぽどじゃないとブ...
-
付き合ってもない男性からLINE...
-
元彼の私物、取りに来ないと思...
-
ブロックされて、時間を半年以...
-
LINEブロックせず非表示削除
-
LINEブロックされていたら嫌わ...
-
LINEをブロックして少したって...
-
話してないLINEの友達ってブロ...
-
LINEブロックしてるのに インス...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
彼氏を勢いでブロックして後悔...
-
ラインでブロックした覚えのな...
-
LINEをすぐブロックする人って...
-
アプリで会う約束してたのに、...
-
女性がLINEをブロックするのは...
-
私は45です。 Gravityで知り合...
-
凄い困ってます。 別れた元カノ...
-
LINEブロックせず非表示削除
-
元彼の私物、取りに来ないと思...
-
付き合ってもない男性からLINE...
-
ラインブロックされました。
-
付き合ってない好きな人を忘れ...
-
話さなくなった人のLINEって皆...
-
LINEってよっぽどじゃないとブ...
-
元カノのLINEをブロック解除す...
-
LINEをブロックして少したって...
-
ブロックされて、時間を半年以...
-
学生時代の友人と縁を切りたい...
-
嫌いになったのにブロックしない
-
LINEでトーク開くことすらせず...
おすすめ情報
説明が不足しており、申し訳ないです。。
質問1:あー、やっぱりファイルを増やしすぎるのはよくないですね。。
出力結果はまとめて「result.txt」に出力、でご回答いただけると幸いです。
質問2:yesです。
質問3:レコードが複数行ある場合は、すべて出力したいです。
以下が出力のイメージです。
result.txt↓
都道府県名, 担当ブロック名, 担当者名, 電話番号, メールアドレス, ・・・
北海道, 1ブロック, 佐藤 浩二, (略), kjsato@aaa.co.jp
北海道, 3ブロック, 佐藤 浩二, (略), kjsato@aaa.co.jp
都道府県名, 担当ブロック名, 担当者名, 電話番号, メールアドレス,
北海道, 2ブロック, 田中 洋子, (略), yktanaka@aaa.co.jp
(以下略)
以上、どうぞよろしくお願いいたします。
ごめんなさい、「result.txt」ではなく「result.csv」です
はい、ソートして・・。可能であれば、メールアドレスごとに改行とヘッダーを入れたかったのですが、その部分の処理をどうかけばいいのかがよくわかっていません。
はい!まさに理想の形ですが、どのようにしたらよいのでしょうか?