dポイントプレゼントキャンペーン実施中!

初めて質問いたします

以下のような形式のCSVファイルがあります
例)
品名,数量,単価,金額
"りんご",1,150,150
"バナナ",10,200,2000
"メロン","1,000","2,000","2,000,000"

上記のように、品名にはダブルクォーテションがつき、
数量、単価、金額については桁区切りのカンマが発生する場合、ダブルクォーテーションで囲まれています

上記のようなデータを
りんご,1,150,150
バナナ,10,200,2000
メロン,1000,2000,2000000
のように別ファイルへ出力するにはどのようにすればよいでしょうか?

プログラムでの処理で、WSHを使ったものを教えていただけますと、幸いです
よろしくお願いいたします

A 回答 (6件)

もう仕事は終わってしまったかもしれませんが、(^^ゞ


VBS で作ってみました。
対象CSVファイルのあるフォルダに保存して実行してみてください。
_NewFilesフォルダに保存されます。
※対象外のCSVファイルが有っても処理してしまいます

Dim oSh
Dim oFs
Dim BaseFolder
Dim newFolder
Dim f

Set oSh = CreateObject("Wscript.Shell")
Set oFs = CreateObject("Scripting.FilesystemObject")
Set BaseFolder = oFs.getFolder(oSh.currentDirectory)

newFolder = BaseFolder.Path & "\" & "_NewFiles"

If oFs.folderExists(newFolder) = False Then
oFs.createFolder (newFolder)
End If

For Each f In BaseFolder.Files
If oFs.GetExtensionName(f) = "csv" Then
Call changeIt(f.Path, newFolder)
End If
Next

MsgBox newFolder & " フォルダ内を検証"


Sub changeIt(orgFname, trgFolder)
Dim oFs
Dim orgF
Dim newF
Dim newFname
Dim buF
Dim oReg

Dim Mcol
Dim M
Dim M1, M2
Const forReading = 1
Const forWriting = 2

Set oFs = CreateObject("Scripting.fileSystemObject")
Set oReg = CreateObject("VBScript.RegExp")
Set orgF = oFs.getFile(orgFname).openAsTextStream(forReading)

newFname = trgFolder & "\" & oFs.getBaseName(orgFname) & "_New.csv"
oFs.CreateTextFile (newFname)
Set newF = oFs.getFile(newFname).openAsTextStream(forWriting)

With oReg
.Pattern = """.*?"""
.IgnoreCase = False
.Global = True
End With

Do Until orgF.atendofstream
buF = orgF.readline
Set Mcol = oReg.Execute(buF)

For Each M In Mcol
M1 = Replace(M.Value, ",", "")
buF = Replace(buF, M.Value, M1)
M2 = Replace(M1, Chr(34), "")
buF = Replace(buF, M1, M2)
Next

newF.WriteLine buF
Loop

orgF.Close: newF.Close
Set Mcol = Nothing
Set oReg = Nothing

End Sub

この回答への補足

nicotinismさん

おはようございます
さきほど、検証しましたところ、無事作動いたしました
ありがとうございます!!

補足日時:2012/10/01 09:50
    • good
    • 3
この回答へのお礼

こんにちわ!

現在、確認できないので、時間があいた時に検証させていただきます

急ぎ、御礼まで。

お礼日時:2012/09/29 17:47

こんにちは、#2です。



 >対象となるファイルが複数あり、全てのファイルに対して、その作業を行うこととな
ると、
 それでは、VBAで複数ファイルを処理するように簡単なプログラムを組めば良いと思います。

では。
    • good
    • 0
この回答へのお礼

さきほど、同一フォルダ内の統一されたフォーマットのCSVファイルに対して、
試してみたところ、動作確認がとれました。

ありがとうございます

お礼日時:2012/09/28 12:30

RFC4180準拠なら、データ中にダブルクォーテションを含む場合も想定されています。


品名にカンマやダブルクォーテションを含む場合の対応は考えていないのですか?
究極的には改行コードまでルールにあったりしますが。。。

入力データにカンマやダブルクォーテションが入らない保証が無いなら
中途半端な逃げの対策を考えるより、CSVのフォーマットに完全に対応した
ライブラリ探す方が良いと思います。
    • good
    • 0
この回答へのお礼

回答ありがとうございます

普段、こういった作業とほとんど関わりがないのですが、
そのような手もあるんですね。

参考になりました
ありがとうございます

お礼日時:2012/09/28 12:28

CSVに吐き出すのに、数値をカンマ編集するってのがアホとしか言い様がないけど



例えば、行単位にダブルクォーテンションでスプリット関数掛けたらどうだろう?
どんな単価や金額でも、スプリット後の配列は一定にならないかな?

実地で試していないので想定だが・・・

ん?
『数量、単価、金額については桁区切りのカンマが発生する場合、ダブルクォーテーションで囲まれています』とな・・・
orz

駄目だこりゃ。

カンマでスプリット掛けて、分割された配列からダブルクォートを探すという泥臭い方法かな
ま、スプリットしてもしなくとも大差ないか
    • good
    • 0
この回答へのお礼

回答ありがとうございます

trajaaさんのおっしゃる通りで、ダブルクォーテションがついたりつかなかったり、
また、数字の桁区切りのせいで、カンマの数が一定でないところが微妙なんですよね。

カンマでスプリットを掛けたあと、"2 000 000" といった形になってしまうので、
ダブルクォーテションを見つけたら、配列をくっつけるというのも1つの手かなとは思っています

ファイル仕様に問題があるといえばそれまでなのですが、
何か方法があれば、また教示いただけるとありがたいです

ありがとうございます。

お礼日時:2012/09/28 11:30

こんにちは。



 プログラムを組まない方法ではだめでしょうか。

 Excelで開いて、単価、金額の列の書式を「標準」に変更し、名前を付けて保存すればカンマがとれます。(Excel2003で確認)

では。
    • good
    • 1
この回答へのお礼

回答ありがとうございます

確かにその方法だと、可能かもしれませんが、
対象となるファイルが複数あり、全てのファイルに対して、その作業を行うこととなると、
あまり現実的ではないと考え、プログラムの作成を検討しておりました。

どうしても手作業となると、ミスの原因にもなりかねませんし。

もう少し検討してみます
ありがとうございました

お礼日時:2012/09/28 11:11

そもそも論で言えば、CSVを吐き出す側で対処するのが根本対策



そうじゃない場合

この辺を参考に、ファイルを開き
http://www.atmarkit.co.jp/fwin2k/tutor/cformwsh1 …

この辺を参考に、ファイルのデータを取り込み
http://www.atmarkit.co.jp/fwin2k/tutor/cformwsh1 …

この辺を参考に、文字列操作する
http://www.atmarkit.co.jp/fwin2k/tutor/cformwsh0 …
    • good
    • 0
この回答へのお礼

早速の回答ありがとうございます

Replaceを使って、品名のダブルクォーテーションを削除するところまでは上手くいったのですが、
問題なのが、桁区切りのカンマを含むダブルクォーテーションですね

>CSVを吐き出す側で対処するのが根本対策
実は提供されたデータをオフコンへインポートする際に困っておりまして、
この旨も相手側へ伝えたのですが、一向に改善の余地なしでして・・

お礼日時:2012/09/28 10:42

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A