• ベストアンサー

カンマ区切りのCSVファイルから""を削除したい

初めて質問いたします 以下のような形式のCSVファイルがあります 例) 品名,数量,単価,金額 "りんご",1,150,150 "バナナ",10,200,2000 "メロン","1,000","2,000","2,000,000" 上記のように、品名にはダブルクォーテションがつき、 数量、単価、金額については桁区切りのカンマが発生する場合、ダブルクォーテーションで囲まれています 上記のようなデータを りんご,1,150,150 バナナ,10,200,2000 メロン,1000,2000,2000000 のように別ファイルへ出力するにはどのようにすればよいでしょうか? プログラムでの処理で、WSHを使ったものを教えていただけますと、幸いです よろしくお願いいたします

質問者が選んだベストアンサー

  • ベストアンサー
  • nicotinism
  • ベストアンサー率70% (1019/1452)
回答No.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

naokichi53
質問者

お礼

こんにちわ! 現在、確認できないので、時間があいた時に検証させていただきます 急ぎ、御礼まで。

naokichi53
質問者

補足

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

その他の回答 (5)

  • akina_line
  • ベストアンサー率34% (1124/3287)
回答No.5

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

naokichi53
質問者

お礼

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

  • MARU4812
  • ベストアンサー率43% (196/452)
回答No.4

RFC4180準拠なら、データ中にダブルクォーテションを含む場合も想定されています。 品名にカンマやダブルクォーテションを含む場合の対応は考えていないのですか? 究極的には改行コードまでルールにあったりしますが。。。 入力データにカンマやダブルクォーテションが入らない保証が無いなら 中途半端な逃げの対策を考えるより、CSVのフォーマットに完全に対応した ライブラリ探す方が良いと思います。

naokichi53
質問者

お礼

回答ありがとうございます 普段、こういった作業とほとんど関わりがないのですが、 そのような手もあるんですね。 参考になりました ありがとうございます

  • trajaa
  • ベストアンサー率22% (2662/11921)
回答No.3

CSVに吐き出すのに、数値をカンマ編集するってのがアホとしか言い様がないけど 例えば、行単位にダブルクォーテンションでスプリット関数掛けたらどうだろう? どんな単価や金額でも、スプリット後の配列は一定にならないかな? 実地で試していないので想定だが・・・ ん? 『数量、単価、金額については桁区切りのカンマが発生する場合、ダブルクォーテーションで囲まれています』とな・・・ orz 駄目だこりゃ。 カンマでスプリット掛けて、分割された配列からダブルクォートを探すという泥臭い方法かな ま、スプリットしてもしなくとも大差ないか

naokichi53
質問者

お礼

回答ありがとうございます trajaaさんのおっしゃる通りで、ダブルクォーテションがついたりつかなかったり、 また、数字の桁区切りのせいで、カンマの数が一定でないところが微妙なんですよね。 カンマでスプリットを掛けたあと、"2 000 000" といった形になってしまうので、 ダブルクォーテションを見つけたら、配列をくっつけるというのも1つの手かなとは思っています ファイル仕様に問題があるといえばそれまでなのですが、 何か方法があれば、また教示いただけるとありがたいです ありがとうございます。

  • akina_line
  • ベストアンサー率34% (1124/3287)
回答No.2

こんにちは。  プログラムを組まない方法ではだめでしょうか。  Excelで開いて、単価、金額の列の書式を「標準」に変更し、名前を付けて保存すればカンマがとれます。(Excel2003で確認) では。

naokichi53
質問者

お礼

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

  • trajaa
  • ベストアンサー率22% (2662/11921)
回答No.1

そもそも論で言えば、CSVを吐き出す側で対処するのが根本対策 そうじゃない場合 この辺を参考に、ファイルを開き http://www.atmarkit.co.jp/fwin2k/tutor/cformwsh16/cformwsh16_01.html この辺を参考に、ファイルのデータを取り込み http://www.atmarkit.co.jp/fwin2k/tutor/cformwsh19/cformwsh19_01.html この辺を参考に、文字列操作する http://www.atmarkit.co.jp/fwin2k/tutor/cformwsh04/cformwsh04_01.html

naokichi53
質問者

お礼

早速の回答ありがとうございます Replaceを使って、品名のダブルクォーテーションを削除するところまでは上手くいったのですが、 問題なのが、桁区切りのカンマを含むダブルクォーテーションですね >CSVを吐き出す側で対処するのが根本対策 実は提供されたデータをオフコンへインポートする際に困っておりまして、 この旨も相手側へ伝えたのですが、一向に改善の余地なしでして・・

関連するQ&A