
初めて質問いたします
以下のような形式のCSVファイルがあります
例)
品名,数量,単価,金額
"りんご",1,150,150
"バナナ",10,200,2000
"メロン","1,000","2,000","2,000,000"
上記のように、品名にはダブルクォーテションがつき、
数量、単価、金額については桁区切りのカンマが発生する場合、ダブルクォーテーションで囲まれています
上記のようなデータを
りんご,1,150,150
バナナ,10,200,2000
メロン,1000,2000,2000000
のように別ファイルへ出力するにはどのようにすればよいでしょうか?
プログラムでの処理で、WSHを使ったものを教えていただけますと、幸いです
よろしくお願いいたします
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
No.4
- 回答日時:
RFC4180準拠なら、データ中にダブルクォーテションを含む場合も想定されています。
品名にカンマやダブルクォーテションを含む場合の対応は考えていないのですか?
究極的には改行コードまでルールにあったりしますが。。。
入力データにカンマやダブルクォーテションが入らない保証が無いなら
中途半端な逃げの対策を考えるより、CSVのフォーマットに完全に対応した
ライブラリ探す方が良いと思います。
回答ありがとうございます
普段、こういった作業とほとんど関わりがないのですが、
そのような手もあるんですね。
参考になりました
ありがとうございます
No.3
- 回答日時:
CSVに吐き出すのに、数値をカンマ編集するってのがアホとしか言い様がないけど
例えば、行単位にダブルクォーテンションでスプリット関数掛けたらどうだろう?
どんな単価や金額でも、スプリット後の配列は一定にならないかな?
実地で試していないので想定だが・・・
ん?
『数量、単価、金額については桁区切りのカンマが発生する場合、ダブルクォーテーションで囲まれています』とな・・・
orz
駄目だこりゃ。
カンマでスプリット掛けて、分割された配列からダブルクォートを探すという泥臭い方法かな
ま、スプリットしてもしなくとも大差ないか
回答ありがとうございます
trajaaさんのおっしゃる通りで、ダブルクォーテションがついたりつかなかったり、
また、数字の桁区切りのせいで、カンマの数が一定でないところが微妙なんですよね。
カンマでスプリットを掛けたあと、"2 000 000" といった形になってしまうので、
ダブルクォーテションを見つけたら、配列をくっつけるというのも1つの手かなとは思っています
ファイル仕様に問題があるといえばそれまでなのですが、
何か方法があれば、また教示いただけるとありがたいです
ありがとうございます。
No.2
- 回答日時:
こんにちは。
プログラムを組まない方法ではだめでしょうか。
Excelで開いて、単価、金額の列の書式を「標準」に変更し、名前を付けて保存すればカンマがとれます。(Excel2003で確認)
では。
回答ありがとうございます
確かにその方法だと、可能かもしれませんが、
対象となるファイルが複数あり、全てのファイルに対して、その作業を行うこととなると、
あまり現実的ではないと考え、プログラムの作成を検討しておりました。
どうしても手作業となると、ミスの原因にもなりかねませんし。
もう少し検討してみます
ありがとうございました
No.1
- 回答日時:
そもそも論で言えば、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 …
早速の回答ありがとうございます
Replaceを使って、品名のダブルクォーテーションを削除するところまでは上手くいったのですが、
問題なのが、桁区切りのカンマを含むダブルクォーテーションですね
>CSVを吐き出す側で対処するのが根本対策
実は提供されたデータをオフコンへインポートする際に困っておりまして、
この旨も相手側へ伝えたのですが、一向に改善の余地なしでして・・
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) vbaマクロについて 次のようなマクロを組みたいです。 自分は初心者なので全くわかりません。 詳しく 8 2023/05/18 18:38
- Visual Basic(VBA) vbaマクロについて 【1.csv】をもとに【商品.csv】に有るものを【有り.csv】として名前を 1 2023/05/18 07:58
- Excel(エクセル) CSVファイルがカンマ区切りにならない。対処法を教えていただきたいです。 仕事でSMS一斉送信ができ 2 2022/07/01 21:24
- その他(データベース) pythonでsqlight勉強中、クエリー結果の利用法教えて下さい 1 2022/04/28 20:38
- Java javaのCSVデータ読込についてです 6 2022/07/02 10:58
- システム メールのcsv添付ファイルの種類を テキスト形式からカンマ区切り形式に 変更する方法はありますか? 4 2023/03/09 20:33
- Access(アクセス) CSVファイルの「0落ち」にVBA 6 2023/02/02 15:27
- Visual Basic(VBA) vbaマクロについて 【シート2】をもとに【シート1】に有るものを「有り.csv」としてデスクトップ 3 2023/05/07 22:30
- Outlook(アウトルック) 【 Windows 10 】アドレス帳に正しくインポートを完了させたい。 3 2023/04/23 13:41
- Visual Basic(VBA) VBAで特定の場所にあるCSVファイル(複数)から特定場所を抜き出してExcelに転記したいです。 11 2023/05/23 16:29
このQ&Aを見た人はこんなQ&Aも見ています
-
Excelでcsvやtxtで保存する時にダブルクォートが勝手に付く
Excel(エクセル)
-
マクロから出力されるcsvのダブルコーテーションをなくしたい。
Visual Basic(VBA)
-
CSVファイルからダブルクォーテーションを削除したい。VBS使用で。
Word(ワード)
-
-
4
Excelの保存で "を付けないように保存できる?"
Excel(エクセル)
-
5
タブ区切りデータからダブルコーテーションを外したい
Excel(エクセル)
-
6
エクセルで文字列をtxtファイルに変換すると"がつく
Excel(エクセル)
-
7
CSVデータの(ダブルクォーテーション)をとりたい!"
その他(プログラミング・Web制作)
-
8
文字列からダブルクオートの削除
Java
-
9
【VBA】ExcelマクロでCSVファイルに保存したデータが"で囲まれてしまう
Visual Basic(VBA)
-
10
csvデータのダブルクォーテーションで囲まれた文字内にあるカンマを削除したい
オープンソース
-
11
【ExcelVBA】各セルをダブルクォーテーションで括ってCSV保存したい
Visual Basic(VBA)
-
12
EXCELからCSVにすると余計なカンマがつきます
Excel(エクセル)
-
13
SQLローダーCSV取込で、囲み文字がデータ中に入っている場合について
Oracle
-
14
CSVファイルの中で、「 , 」カンマを使いたい
その他(コンピューター・テクノロジー)
-
15
エクセルの"の削除方法を教えてください。
その他(Microsoft Office)
-
16
CSV形式にすると出てくる空白を消したいです。
その他(Microsoft Office)
-
17
各項目がダブルクォーテーションで囲まれたカンマ区切りのCSVを作る方法?
Excel(エクセル)
-
18
文字列に含まれているダブルクォーテーション( )を置換する"
その他(パソコン・スマホ・電化製品)
-
19
ダブルクォーテーションの削除(置換)
Perl
-
20
ダブルコーテーション付きでCSV出力
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
マクロから出力されるcsvのダブ...
-
カンマ区切りのCSVファイルから...
-
バッチでCSVを処理する時、空の...
-
【C#】パス名で無効な文字
-
エクセルVBA 大容量CSVファイル...
-
csvファイルのデータの間引きを...
-
CSV形式での保存時に”文字列...
-
【エクセル マクロ】読み込ん...
-
【ExcelVBA】UTF-8の文字コード...
-
【エクセルVBA】お願いします。...
-
VBAでCSVファイルのインポート...
-
csvファイル 項目数取得
-
CSVファイルの項目行を削除...
-
CSVファイルをMDBに取り込む
-
特定文字を入ってるCSVの特定の...
-
Javaのコード
-
csvファイルでの日付設定「yyyy...
-
巨大なCSVの加工(指定列のみの...
-
EXCEL|csvで保存→開くcsvを閉じる
-
CSV出力して、MS/EXCELで開くと...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
カンマ区切りのCSVファイルから...
-
バッチでCSVを処理する時、空の...
-
マクロから出力されるcsvのダブ...
-
csvファイルでの日付設定「yyyy...
-
csvファイル 項目数取得
-
CSV形式での保存時に”文字列...
-
【C#】パス名で無効な文字
-
複数のcsvファイルをExcelに一...
-
VBAでcsvファイルを読み込んで...
-
csvファイルを列数ごとに分割す...
-
【ExcelVBA】UTF-8の文字コード...
-
CSVファイルの項目行を削除...
-
エクセル形式のファイルの読み込み
-
【エクセル マクロ】読み込ん...
-
VBScriptからEXCELのVBAコマン...
-
エクセルVBA 大容量CSVファイル...
-
csvファイルのデータの一部を取...
-
巨大なCSVの加工(指定列のみの...
-
VBA 毎日取得するデータを反映...
-
COBOLでCSVをインプットにして...
おすすめ情報