重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

かなり、困っております・・・。

「c:\csv_data」に複数の連番csvデータ(file_01.csv,file_02.csv,....)が入っており、
csvファイル内に含まれている"AAA"を"AAA_"+ファイル番号に変換させたいです。(下記の例を参考にして下さい。)

例:file_01.csv→AAAをAAA_01、file_02.csv→AAAをAAA_02、・・・・・

(フォルダ内の全てのcsvを変換させたいです)
一度作ってみたんですが、Excel-VBAでCSVファイルを開いて編集をかけると書式が失われてしまう為、だめでした・・・。
そこで
・Excel-VBAでの良い方法
・BATファイルで拡張子csv⇒txtに開いてからの編集⇒csvへ
といった2つの方法(どちらか)がであれば作業工程上、他の処理と同時に
自動化できることからこの2つの方法での文字列変換方法を知りたいです。

どうかよろしくお願いいたします。

質問者からの補足コメント

  • うーん・・・

    GooUserラックさん、お問い合わせありがとうございます。
    質問のけんですが、他の物が消えてしまって、AAA_01のみになってしまいます。

    よろしくお願いいたしますm(_ _)m

    No.1の回答に寄せられた補足コメントです。 補足日時:2017/03/20 18:47
  • うーん・・・

    tatsu99様、お問い合わせありがとうございます。
    1)① "11","AAA","bbb"になります。

    2)エクセルでいうところのA列、先頭列に各行に存在します。

    3)そのようなことはありません。

    どうかよろしくお願いいたしますm(_ _)m

    No.2の回答に寄せられた補足コメントです。 補足日時:2017/03/20 18:52

A 回答 (4件)

VBAです。

以下のマクロを標準モジュールに登録してください。
-------------------------------------------
Option Explicit
Public Sub CSV文字列変換()
Const folder As String = "c:\csv_data"
Dim fname As String
Dim ctr As Long
ctr = 0
fname = Dir(folder & "\" & "file_??.csv", vbNormal)
Do While fname <> ""
ctr = ctr + 1
If CSV_replace(folder, fname) = False Then Exit Sub
fname = Dir()
Loop
MsgBox (ctr & "件のファイルを処理しました")
End Sub

Private Function CSV_replace(ByVal folder As String, ByVal fname As String)
Const target As String = "AAA"
Dim inPath As String
Dim outPath As String
Dim inline As String
Dim outline As String
Dim swd As String
Dim twd As String
CSV_replace = False
swd = """" & target & ""","
twd = """" & target & Mid(fname, 5, 3) & ""","
inPath = folder & "\" & fname
outPath = folder & "\" & "temp_csv.txt"
Open inPath For Input As #1
Open outPath For Output As #2
Do Until EOF(1)
Line Input #1, inline
If Left(inline, Len(swd)) = swd Then
outline = twd & Mid(inline, Len(swd) + 1, Len(inline))
Else
outline = inline
End If
Print #2, outline
Loop
Close #2
Close #1
Kill inPath
Name outPath As inPath
CSV_replace = True
End Function
-------------------------------------------
対象となるファイル名は
file_XX.csv です。(XXは任意の2文字です)
file01.csv,abc_01.csv等は本処理の対象外です。
    • good
    • 0
この回答へのお礼

tatsu99さま、有難うございました。
助かりました。

お礼日時:2017/03/21 04:20

こんばんは。



この質問というのは、どうもやらExcelは、直接関係ないようですね。

>Excel-VBAでCSVファイルを開いて編集をかけると書式が失われてしまう為、だめでした・・・。
Excel VBAがあるから、Excel VBAを使うというだけの話ですよね。同じような質問が最近もありましたが、その人は、Excelファイルを、VBSで処理するというリクエストでした。これは、単に、VBAを利用するだけなのですが、環境的にはずいぶん差があるものです。


'//'標準モジュール
Public mPATH As String
Sub ExchangeWordsInCsv()
 Dim serch_txt As String
 Dim Fname As String
 Dim cnt As Long
 serch_txt = "AAA"
 mPATH = "C:\Users\Test2\"
 If Right$(mPATH, 1) <> "\" Then mPATH = mPATH & "\"
 
 Fname = Dir(mPATH & "*.csv")
 Do While Fname <> ""
  If Fname <> "." And Fname <> ".." Then
   If (GetAttr(mPATH & Fname) And vbNormal) = vbNormal Then
    If InStr(Fname, "_") > 0 Then
     Call ReproduceCSV(Fname, serch_txt)
     cnt = cnt + 1
    End If
   End If
  End If
  Fname = Dir
 Loop
 If cnt > 0 Then
  MsgBox cnt & "個処理しました", vbInformation
 End If
End Sub
Sub ReproduceCSV(ByVal Fname As String, serchWd As String)
 Dim inFNo As Integer
 Dim exFNo As Integer
 Dim exFName As String
 Dim i As Long, n
 Dim strLine As String
 Dim arbuf, buf
 Dim sBrnc As String
 Dim strFlg As Boolean
 sBrnc = Replace(Mid(Fname, InStrRev(Fname, "_")), ".csv", "", 1, 1, 0)
 exFName = "$" & Fname
 inFNo = FreeFile()
 Open mPATH & Fname For Input As #inFNo
 exFNo = FreeFile()
 Open mPATH & exFName For Output As #exFNo
 Do While Not EOF(inFNo)
  Line Input #inFNo, strLine
  arbuf = Split(strLine, ",")
  For Each n In arbuf
   If StrComp(serchWd, n, 0) = 0 Or StrComp("""" & serchWd & """", n, 0) = 0 Then
    If buf = "" Then
     buf = Replace(n, serchWd, serchWd & sBrnc)
     Else
     buf = buf & "," & Replace(n, serchWd, serchWd & sBrnc)
    End If
    Else
    If buf = "" Then
     buf = n
     Else
     buf = buf & "," & n
    End If
   End If
  Next
  Print #exFNo, buf
  buf = ""
  Erase arbuf
 Loop
 Close #inFNo
 Close #exFNo
 Kill mPATH & Fname '元のファイルを削除
 Name mPATH & exFName As mPATH & Fname '名前の変更
End Sub

'//
処理前と処理後の結果 (仮名:entring605データb_AB.csv)
WinMerge 使用
「複数連番付きCSVデータの文字列置換につ」の回答画像3
    • good
    • 0
この回答へのお礼

WindFallerさま、有難うございました。
また機会がありましたご教示ください。
よろしくお願いいたします。

お礼日時:2017/03/21 04:22

補足要求です。


1)データは、どのように格納されてますか。
① "11","AAA","bbb"
② 11,AAA,bbb

①でしょうか、それとも②でしょうか?

2)AAAがあるのは、どの列ですか。それとも、いろいろな列にAAAがありますか。

3)念の為、確認ですが
file_01.csvに AAABBBというデータがあったとき、
AAA_01BBBに置き換える必要はないですね。
この回答への補足あり
    • good
    • 0

「書式が失われてしまう」とはどういう事でしょうか?


元々CSVファイルは書式など持っていないはずですが?
もしかしたら「"AAA"」のように前後に有った「"」が無くなってしまうという事でしょうか?
この回答への補足あり
    • good
    • 0

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