- ベストアンサー
CSVファイルの任意の列をダブルクォーテーションで囲みたいのですが・・・。
CSVファイルの任意の列をダブルクォーテーションで囲みたいのですが・・・。 例えば abc,def,ghi,jkl mno,pqr,stu,vwx ↓ abc,"def",ghi,"jkl" mno,"pqr",stu,"vwx" というように、2番目と4番目の列の文字列をダブルクォーテーションで囲む、といった具合にです。 調べてみるとVBAを使用する方法はあるようですが、EXCELやその他のフリーソフト等を使用して処理する方法はありませんでしょうか。 よろしくお願いいたします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
原始的ですが、、 1.csvファイルとしてExcelで開く。 拡張子がcsvであれば自動的に判別してくれます。 2.囲みたい列の前後に列を挿入する。 質問者さんの例の場合、B,D,FとH以降が空白になる。 3.囲みたい列の前の列の全行に「あ」と入れる。 囲みたい列の前の列の全行に「い」と入れる。 (※ファイル内で使われていない文字を入れる。漢字でも記号でもいい。) 4.いったん、上書き保存し CSVのままでいいか聞かれるので「はい」を選ぶ。 5.Excelを閉じる。 保存するか聞かれるが、保存しない。 6.更新されたcsvファイルをテキストエディタ(メモ帳等)で開く。 7.置換で「あ,」→「"」に、「,い」→「"」に置換する。 というので、どうでしょう。
その他の回答 (3)
- Wendy02
- ベストアンサー率57% (3570/6232)
質問者の方は、レビューをしないようですが、もう少し考えてみました。 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
お礼
再度回答ありがとうございます。 VBAやマクロを使いこなせたら、と思うことがあります。
- MackyNo1
- ベストアンサー率53% (1521/2850)
csvファイルを開いてワードでワイルドカード置換するのが簡単かもしれません。 たとえば、2列目と4列目をダブルコーテーションで囲むなら、ワードでCtrl+Hで置換ダイアログを出して、「オプション」ボタンをクリックし、「ワイルドカード置換する」にチェックを入れ「検索する文字列に「(*,)(*),(*,)(*)^13」置換後の文字列に「\1"\2"\3"\4"^13」と入力して「すべて置換」します。 ちなみにエクセルで処理する場合は、csvファイルをエクセルで開いて、該当列のセルの書式設定で表示形式をユーザー定義にして「!"@!"」などにすればそのセルの値にダブルコーテーションを入れることができます。 これをcsvファイルで保存すると、そのテキストファイルはダブルコーテーションが3つ付いてしまいますので、上記の操作と同様に「"""」を「"」に一括置換することでも対応することができます。
お礼
回答ありがとうございました。
- Wendy02
- ベストアンサー率57% (3570/6232)
こんにちは。 正規表現のテキストエディタで置換すればよいのと思います。Excel のVBAよりは簡単かな? 検索値:^([^,]*),([^,]*),([^,]*),([^,]*) 置換値:$1,"$2",$3,"$4" なお、 abc,,ghi,jkl,abc,def,ghi,jkl こういう場合は、 abc,"",ghi,"jkl",abc,def,ghi,jkl となります。
お礼
回答ありがとうございます。 正規表現はあまり理解できてないので、機会があれば勉強してみようと思います。 挙げていただいた例をそのままやってみましたが、例の通りの結果は得られませんでした。 やり方が間違ってるのでしょうね。
お礼
回答ありがとうございます。 やりたかったことがバッチリできました。 スムーズにやる方法がないかばかり考えて、考え至りませんでした。 ありがとうございました。