• ベストアンサー

CSVファイルの任意の列をダブルクォーテーションで囲みたいのですが・・・。

CSVファイルの任意の列をダブルクォーテーションで囲みたいのですが・・・。 例えば  abc,def,ghi,jkl  mno,pqr,stu,vwx     ↓  abc,"def",ghi,"jkl"  mno,"pqr",stu,"vwx" というように、2番目と4番目の列の文字列をダブルクォーテーションで囲む、といった具合にです。 調べてみるとVBAを使用する方法はあるようですが、EXCELやその他のフリーソフト等を使用して処理する方法はありませんでしょうか。 よろしくお願いいたします。

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

  • ベストアンサー
  • seiiiichi
  • ベストアンサー率41% (79/190)
回答No.1

原始的ですが、、 1.csvファイルとしてExcelで開く。   拡張子がcsvであれば自動的に判別してくれます。 2.囲みたい列の前後に列を挿入する。   質問者さんの例の場合、B,D,FとH以降が空白になる。 3.囲みたい列の前の列の全行に「あ」と入れる。   囲みたい列の前の列の全行に「い」と入れる。   (※ファイル内で使われていない文字を入れる。漢字でも記号でもいい。) 4.いったん、上書き保存し   CSVのままでいいか聞かれるので「はい」を選ぶ。 5.Excelを閉じる。   保存するか聞かれるが、保存しない。 6.更新されたcsvファイルをテキストエディタ(メモ帳等)で開く。 7.置換で「あ,」→「"」に、「,い」→「"」に置換する。 というので、どうでしょう。

fl99
質問者

お礼

回答ありがとうございます。 やりたかったことがバッチリできました。 スムーズにやる方法がないかばかり考えて、考え至りませんでした。 ありがとうございました。

その他の回答 (3)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.4

質問者の方は、レビューをしないようですが、もう少し考えてみました。 Wordで試してみましたが、通常では、ダブルクォーテーションが、2byte文字に変わってしまいます。それは、Wordでは、オートコレクトが働いていますから、それを外さなくてはなりません。また、CSVのファイル構造は、列数が決まったものに限りますね。行頭を意味するワイルドカードがあると良いのですが、見当たりません。Wordは、どうも完全に正規表現を表現できるようではありません。 マクロを考えてみました。マクロに対して使う前から否定的かだと、どうしようもありませんが、一通りのエラー処理はされています。 標準モジュールに貼りつけて起動すると、ファイルを選択するダイアログが働きます。以下は、バックアップモードはオフになっています。 '------------------------------------------- 'Option Explicit Sub TestCSVChange()   'CSVの列にダブルクォーテーションを入れるマクロ   Const AIMEDCOL As String = "2,4" '数字を入れ、カンマで区切る   Const BkMODE As Boolean = False 'バックアップモード = True   Dim arCol As Variant   Dim fName As Variant   Dim fName2 As Variant   Dim oFNum As Integer   Dim iFNum As Integer   Dim myArray As Variant   Dim i As Long, j As Variant   Dim buf As String   Dim TextLine As String   Dim Matches As Object   Dim Match As Object   Dim Tmp As String   On Error GoTo ErrHandler   arCol = Split(AIMEDCOL, ",")   fName = Application.GetOpenFilename("CSVファイルl(*.csv),*.csv")   If VarType(fName) = vbBoolean Then Exit Sub   iFNum = FreeFile()   Open fName For Input As #iFNum   oFNum = FreeFile()   Open "temp.csv" For Output As #oFNum      Do While Not EOF(iFNum)     Line Input #iFNum, TextLine     If Len(TextLine) > 1 Then       myArray = Split(TextLine, ",")       For i = LBound(myArray) To UBound(myArray)         j = Application.Match(CStr(i + 1), arCol, 0)         If IsNumeric(j) Then           buf = buf & "," & """" & myArray(i) & """"         Else           buf = buf & "," & myArray(i)         End If       Next i     End If     Print #oFNum, Mid$(buf, 2)     buf = ""   Loop ErrHandler:   Close #iFNum   Close #oFNum   If Err.Number = 0 Then     'バックアップモード     If BkMODE Then       Tmp = Mid$(fName, 1, InStrRev(fName, "\")) & _       "$" & Format$(Now(), "dhhmmss") & ".csv"       Do         If Dir(Tmp) = "" Then           Name fName As Tmp           Exit Do         Else           Tmp = Mid$(fName, 1, InStrRev(fName, "\")) & _           "$" & Format$(Now(), "dhhmmss") & ".csv"         End If         DoEvents       Loop     Else       Kill fName     End If     Name "temp.csv" As fName     Beep   Else     MsgBox Err.Number & ":" & Err.Description, vbExclamation   End If End Sub

fl99
質問者

お礼

再度回答ありがとうございます。 VBAやマクロを使いこなせたら、と思うことがあります。

  • MackyNo1
  • ベストアンサー率53% (1521/2850)
回答No.3

csvファイルを開いてワードでワイルドカード置換するのが簡単かもしれません。 たとえば、2列目と4列目をダブルコーテーションで囲むなら、ワードでCtrl+Hで置換ダイアログを出して、「オプション」ボタンをクリックし、「ワイルドカード置換する」にチェックを入れ「検索する文字列に「(*,)(*),(*,)(*)^13」置換後の文字列に「\1"\2"\3"\4"^13」と入力して「すべて置換」します。 ちなみにエクセルで処理する場合は、csvファイルをエクセルで開いて、該当列のセルの書式設定で表示形式をユーザー定義にして「!"@!"」などにすればそのセルの値にダブルコーテーションを入れることができます。 これをcsvファイルで保存すると、そのテキストファイルはダブルコーテーションが3つ付いてしまいますので、上記の操作と同様に「"""」を「"」に一括置換することでも対応することができます。

fl99
質問者

お礼

回答ありがとうございました。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.2

こんにちは。 正規表現のテキストエディタで置換すればよいのと思います。Excel のVBAよりは簡単かな? 検索値:^([^,]*),([^,]*),([^,]*),([^,]*) 置換値:$1,"$2",$3,"$4" なお、  abc,,ghi,jkl,abc,def,ghi,jkl こういう場合は、  abc,"",ghi,"jkl",abc,def,ghi,jkl となります。

fl99
質問者

お礼

回答ありがとうございます。 正規表現はあまり理解できてないので、機会があれば勉強してみようと思います。 挙げていただいた例をそのままやってみましたが、例の通りの結果は得られませんでした。 やり方が間違ってるのでしょうね。

関連するQ&A