いつもお世話になっております。

現在VB6.0にて、CSVファイルを読み込む処理をしています。
・ファイル読み込みにて1行ファイルを読み込む。
・Split関数で「,」で区切って項目ごとに配列に保持する。
というロジックで作成しているのですが、
項目内に改行コードが存在する場合にうまく読み込めません。
(1行ずつ読んでるので当然ですが…)

項目内のコードをLF、実際の行の改行をCR+LFで区別すると読み込む
のは分かるのですが、項目内の改行コードがCR+LFの場合でも、
正しく読み込みたいです。

以上です。よろしくお願い致します。

A 回答 (5件)

    • good
    • 1

意味的に、列に相当する、数字は一定ではないのですか


フィールド数 5(カンマ4つ)ーー第1レコード(Line Inputで読んで)
3(カンマ2つ)ーー第2レコード
2(カンマ1ツ)ーー第3レコード
・・
のようであればSplitしたUbound数を足して行き、5になったら
一般通常でのケースの、次行の扱いをするロジックで解決しませんか。
それで不可能なら、この質問のケースの、たまたまの好都合条件を捉えて、意味的に先頭フィールドを探すとかしかなくなる。
他フィールドにはない。例えば完成形のデータを考えると、先頭に7桁の定桁数字が来るとか。
コンピュタープログラム作成と言うのは、特賞を捉えて処理を進める
学だとお思います。
    • good
    • 0

#1 Wizard_Zeroです。



ダブルクォートでくくられているのであれば、
・ダブルクォートで終わる行はそのままSplit
・それ以外なら次の行も連結

でいけると思います。
ただ、データ内にカンマがあればこれまた厄介で、地道にダブルクォートを考慮しながら切り分ける必要があります。
(これも、行の前後のダブルクォート取り除いて "," で分解すればいいんですけどね。", " のように間にスペースがあったりするとまた厄介という・・・)
    • good
    • 0

根本的に設計ミスです。



項目内に改行を含む場合は、CSVはダブルクォーテーションでくくる形式にするようにするのが、定石です。

この回答への補足

ご回答ありがとうございます。
記述漏れでしたが、
CSVファイルは全ての項目がともダブルクォーテーションでくくられています。
説明不足で申し訳ありません。

補足日時:2009/05/20 11:00
    • good
    • 0

CSVファイルの1レコードあたりの項目数が固定という前提で、Splitで分解したときに項目数が足りない時は次の行と連結してSplitする。



という方法を思いついたのですが、レコードの最後の項目が改行されていたらうまくいきませんね・・・。
この場合、次の行には前の行における最後の項目の残りだけが記録されるので、カンマのない行は前の列と連結としたいところですが、そうなると今度は、最初の項目で改行されていたら・・・というジレンマに陥ります。
(最初と最後の項目が絶対に改行されないのであればこのあたりを考慮する必要はありませんが…)

どちらにしても、レコードに改行が含まれていることを明確に知る手段が必要になるでしょう。
・レコード内の改行コードはLFに限定する
・改行コードのあるレコードはダブルクォーテーションでくくる
などのルールがあれば、それにあわせて読み込みも出来るようになります。

もしこのようなことが出来ないのであれば、100%の精度で読み込むことはできないため、読み込んだあとにレコードを手動で変更できる手段を提供する必要があると思います。

この回答への補足

ご回答ありがとうございます。
記述漏れでしたが、
・改行コードのあるレコードはダブルクォーテーションでくくる
は既に実現されています。
説明不足で申し訳ありません。

補足日時:2009/05/20 10:59
    • good
    • 0

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

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q文字+改行コードの置換について

文字+改行コードの置換についてご教授ください。
テキスト内の数字「9」とそれに続く改行コードのみ置換(削除)対象にしています。
全ての改行コードが対象ではないため、下記のようにエディタ(sakuraエディタ)で指定しました。

置換前: 9\r\n
※削除したいため、置換後の欄は空欄にしています。

しかし、この設定だと置換前の文字列を置換対象として認識しません。(検索対象としても)
\r\n だけだと改行コードを認識するので、文字と改行コードのセットを認識していないようです。

指定に誤りがあるのでしょうか。詳しい方ご教授お願いします。

Aベストアンサー

>「9」とそれに続く改行コードのみ置換(削除)
最後に「9」がある文字列の「9」を削除したいことでしょうか?

1あいうえお9 → 1あいうえお
9かきくけこ7 → 9かきくけこ7
さしすせそ999 → さしすせそ99

置換ダイアログの正規表現にチェックを入れます。

最後に「9」+改行コードのみ置換なら
置換前「9\r\n」
置換後「\r\n」

最後に「9」+改行コードがある行を削除するなら
置換前「^.*9\r\n」
置換後「」(空欄)

Qテキストファイルから改行コードを削除して読込む方法

ExcelエクセルVBAマクロについてテキストファイルから改行コードを取り除いて
変数に読み込む方法について確認させてください。

下記のVBAログラムはWordファイルをテキストファイルに落としたファイルを変数aに
読み込んでいます。
このとき、読み込んだテキストファイルはWordファイルをテキストファイルに
落とし込んだファイルなので改行コードが残ってしまいます。
この改行コードを削除したうえで変数aに読み込みたいのですが可能でしょうか。
改行コードはメモ帳では「↓」と下矢印に似た文字で表示されます。
(実際には下矢印ではないようです。)
今のところ、Replace関数で改行コードを削除するプログラムを
考えているのですが、改行コードのVBAでの表現方法が分からないので
先に進むことが出来ません。いい案があればぜひご教授下さい。
あるいはほかの方法でも改行コードが削除出来れば結構です。

またこの変数aに読み込んである文字列からかぎカッコの内部にある文字を
抽出してエクセルの行方向に出力する方法があればご教授頂ければ幸いです。
例えば
“あなたは「こんにちは」と言いました。
私は「元気ですか」と聞きました。”

が文字列aに読み込んである場合、“こんにちは”、“元気ですか”を抽出して
エクセルに順に出力という方法です。

色々と書きましたが、よろしくお願いいたします。
以下、VBAプログラム本文です。

----------------------------------
Sub sample1()

Dim a As String

a = CreateObject("Scripting.FileSystemObject").GetFile("C:\sample.txt").OpenAsTextStream.Readall
CreateObject("Scripting.FileSystemObject").GetFile("C:\sample.txt").OpenAsTextStream.Close

End Sub

ExcelエクセルVBAマクロについてテキストファイルから改行コードを取り除いて
変数に読み込む方法について確認させてください。

下記のVBAログラムはWordファイルをテキストファイルに落としたファイルを変数aに
読み込んでいます。
このとき、読み込んだテキストファイルはWordファイルをテキストファイルに
落とし込んだファイルなので改行コードが残ってしまいます。
この改行コードを削除したうえで変数aに読み込みたいのですが可能でしょうか。
改行コードはメモ帳では「↓」と下矢印に似た文字で表示されま...続きを読む

Aベストアンサー

Windowsの改行はCRLFです。#1さんの仰るとおり、chr(13)+chr(10)ですね。
あるいはvbCr,vbLf,vbCrLfなんてのもあります。

あとプログラム本文は良くないです。
最低でもこう書くべきです。
'-------------------------------------------------
dim objStream as Object
set objStream = CreateObject("Scripting.FileSystemObject").GetFile("C:\sample.txt").OpenAsTextStream
a=objStream.readall
objStream.Close
'--------------------------------------------------
もとのソースだと、...OpenAsTextStreamと書いた時点でテキストを開いてます。
1回目と2回目は別のモノ。つまり2回開いてて、1回目は開きっぱなし。

>かぎカッコの内部にある文字を抽出

これはご自分で考えてみて下さい。
例えば、crlfを除去したのなら
b=replace(a,"「",vbcr)
b=replace(b,"」",vbcr)
とでもしておいてvbcrでSplit()すれば配列の奇数番目が括弧の中身です。
括弧が閉じてない場合とか半角だったりする場合とかもあるので注意ですね。
一番良いのは正規表現を使う方法ですが、これはちょっとハードルが高いでしょう。

Windowsの改行はCRLFです。#1さんの仰るとおり、chr(13)+chr(10)ですね。
あるいはvbCr,vbLf,vbCrLfなんてのもあります。

あとプログラム本文は良くないです。
最低でもこう書くべきです。
'-------------------------------------------------
dim objStream as Object
set objStream = CreateObject("Scripting.FileSystemObject").GetFile("C:\sample.txt").OpenAsTextStream
a=objStream.readall
objStream.Close
'--------------------------------------------------
もとのソースだと、...OpenAsTextSt...続きを読む

Qword置換で改行は置換できますか?

word置換で改行は置換できますか?

 一斉にEnterでの改行されている部分を置換する方法はないでしょうか?
 あればよろしくおねがいします。

Aベストアンサー

検索と置換画面の「置換」タブ画面で [オプション] を選択し、右下にある「あいまい検索」のチェックを外します。
検索する文字列にカーソルを置いて、[特殊文字] ボタン → 段落記号(P) を選択すると、検索する文字列に 「^p」が入力されます。(直接キー入力してもOKです)

置換後の文字列に置換する文字列、特殊文字を入力して置換をしますが、何も指定しないで、「置換」または「すべて置換」を行うと、改行が削除されます。

特殊文字の一覧項目の「段落記号」は[Enter]による改行で、[Shift]+[Enter]による改行は、「任意指定の行区切り(L)」です。
 

QVB6.0 改行コードのないファイルの読み込み

VB6.0で改行コードが無く、半角と全角文字が入り混じっているファイルの読み取り方法を教えて下さい。

通常の一行読み込みの範囲を大幅に超えている文字列です。

他のサイトで以下のようなプログラム(20バイトずつ切り取って読む)を見つけたのですが、

Dim InFileNo As Integer
Dim Buf As string * 10
Dim LINE As Long

InFileNo = FreeFile
Open "C:\test.txt" For Random As #InFileNo Len = 20

LINE = 1
Do Until EOF(InFileNo)
Get #InFileNo, LINE, buf
LINE = LINE + 1
Loop

これだと、半角と全角が混じっている箇所で文字化けを起こしてしまいます。

以上です。よろしくお願い致します。

Aベストアンサー

文字数指定の読み込みはInput(文字数,ファイル番号)という文を
使います。但し、EOFを超えるとエラーになるので、TextStreamの
方が楽かも知れません。以下はその例です。

Dim FSO, Txs
Dim Buf As String
Dim LINE As Long

Set FSO = CreateObject("Scripting.FileSystemObject")
Set Txs = FSO.OpenTextFile("C:\test.txt", 1) '1 は入力モード
Do Until Txs.AtEndOfStream
    LINE = LINE + 1
    Buf = Txs.Read(20) '20文字という意味
Loop
Txs.Close

Readメソッドは残りが20文字未満の場合、エラーにならず、残りの
文字列を返します。Input文では残りが指定文字数未満だとエラーに
なります。但し、EOF検出後にReadメソッドを実行すると、さすがに
エラーになります。

QWordVBA 置換処理での改行文字の可否

(実際にはExcelのVBAからWordファイルを開いての処理になるのでExcelのVBAで組んでいますが、)
WordのVBAで、置換処理を作成しています。
keyword1 = "検索文字"
keyword2 = "置換文字"
With objSelection.Find
.Text = keyword1
.Forward = True
.MatchWholeWord = True
.Replacement.Text = keyword2
.Execute Replace:=wdReplaceAll
End With
置換処理自体は出来ています。上記処理は置換部分の抜粋です。
しかし行いたいことはタイトルにもあります通り、置換文字中に改行を含めた状態での置換処理です。
長い文字列を置換するだけなら問題ないのですが、改行を含めてしまうと改行文字が別の文字に置き換えられてしまうようです。
置換先でも改行された状態にしたいのですが、これは書き方に問題があるのでしょうか?
もしくは置換処理ではなく、他の方法を取る必要があるのでしょうか?
教えてください。よろしくお願いいたします。

(実際にはExcelのVBAからWordファイルを開いての処理になるのでExcelのVBAで組んでいますが、)
WordのVBAで、置換処理を作成しています。
keyword1 = "検索文字"
keyword2 = "置換文字"
With objSelection.Find
.Text = keyword1
.Forward = True
.MatchWholeWord = True
.Replacement.Text = keyword2
.Execute Replace:=wdReplaceAll
End With
置換処理自体は出来ています。上記処理は置換部分の抜粋です。
しかし行いたいことはタイトルにもあります通り、置換文字中に改行を含めた状態での置換...続きを読む

Aベストアンサー

こんにちは。

>長い文字列を置換するだけなら問題ないのですが、改行を含めてしまうと改行文字が別の文字に置き換えられてしまうようです。

質問の「WordVBA 行の削除」で、偶然に書いたのですが、改行コードの問題で、Excel側は、セルにvbLF が入っているはずですから、

一旦取得した、置換文字を、以下のようにして
keyword2 = Replace(keyword2, vbLf, Chr(11), , , vbBinaryCompare)

置換すればよいのではありませんか?

ちなみに、これが入っているWordテーブルのセルの中で、改行コードの種類が確認できれば、「WordVBA 行の削除」のVBAのほうも可能です。Paragraph 自体の変更はありません。

QVB2005か2008で、WEBサイトの入力フォームのTextBox内の文章を読み込む方法

VB2005と2008を使っています。
WEBサイトの入力フォームのTextBox(名前をAとする)内の文章を読み込む方法を教えてください。よろしくお願いします。

Aベストアンサー

参照の追加で COMタブの『Microsoft HTML Object library』を追加
WebBrowserコントロールでそのページをナビゲートして
DocumentConmpatedイベントなどで
if wbc.Document isnot nothing then
  dim doc as HTMLDocument = wbc.Document
  dim domDoc as mshtml.HTMLDocument
  domDoc = doc.domDocument
  dim inp as mshtml.HtmlInputelEment
  inp = domDoc.GetElementById( "A" )
  MsgBox( inp.Value )
end if
といった具合でしょう

この方法は ページが表示された時点でTextBox(INPUTタグ)にデータがある場合です
value属性が指定されている場合です

QフリーソフトYokkaGrepでの置換時の改行作業

フリーソフトYokkaGrepでの置換時の改行作業

「改行 置換」でググると、改行を置換でなくす…という方法はでてくるのですが、
置換する時に改行をつける方法がよくわかりませんでした

やりたいことは

aaaa
bbbb
</body>

という文に

検索文字列  </body>
置換後文字列 [改行]ccc[改行]</body>

最終的に

aaaa
bbbb
ccc
</body>

という文章にしたいです。

YokkaGrepというフリーソフトを使っているのですが
改行の指定方法がわかりません。。。

よろしくお願いいたします

Aベストアンサー

ううーんゴメンナサイ。
いまそのソフトをインストールして試す時間がありません。
YokkaSoftのサイトには掲示板があって活発に書き込みがあるようなので、そこで質問してはどうでしょうか。
下のページからsupportで行けるみたいです。
http://www.yokkasoft.net/

Q指定番目の文字を読む込む・・・超初心者

遅ればせながらVISTAを搭載したノートブックを買って遊び始めました。
VB2008Expressをダウンロードして最初のプロジェクトに挑戦中。
が、情けないことに最初から躓いて立ち往生中です。

<ファイルから指定番目の文字を読む込む関数の作成要領>

' ---------------------------
' FileGetChar VB6.0 Version
' ---------------------------
Public Function FileGetChar(ByVal f As String, ByVal r As Long) As String
  Dim n As Integer
  Dim c As String * 1
  
  n = FreeFile()
  Open f For Random As #n Len = 1
  Get #n, r, c
  Close #n
  FileGetChar = c
End Function

' -----------------------------
' FileGetChar VB 2008 Version
' -----------------------------
Public Function FileGetChar(ByVal f As String, ByVal p As Short) As String
  Return (GetChar(My.Computer.FileSystem.ReadAllText(f), p))
End Function

VB 2008バージョンの問題点は、その都度に全てのテキストを呼び込んでいることです。
質問は、この難点を克服する方法についてです。

MSDNライプラリを読めばとは思いますが・・・。
聞いた方が早いかなと思って質問します。
宜しくお願いします。

遅ればせながらVISTAを搭載したノートブックを買って遊び始めました。
VB2008Expressをダウンロードして最初のプロジェクトに挑戦中。
が、情けないことに最初から躓いて立ち往生中です。

<ファイルから指定番目の文字を読む込む関数の作成要領>

' ---------------------------
' FileGetChar VB6.0 Version
' ---------------------------
Public Function FileGetChar(ByVal f As String, ByVal r As Long) As String
  Dim n As Integer
  Dim c As String * 1
  
  n = FreeFile()
...続きを読む

Aベストアンサー

>MSDNライプラリを読めばとは思いますが・・・。
>聞いた方が早いかなと思って質問します。

逆だと思います。
それと(私以外の)回答者さんたちは、MSDNライブラリを読めば分かるようなことを、
わざわざ回答しなければならないことにもなります。


それでも一応アドバイス的なものをしておくと、FileStream.Seekを使うと、
お望みの動作に近いことが可能かもしれません。

参考URL:http://msdn.microsoft.com/ja-jp/library/system.io.filestream.seek.aspx

QMacOS10.6 エクセル2008 改行コード 置換方法

MacOS10.6 にてExcel2008を使用しています。
いま処理しようとしているデータのセル中に改行が含まれており、これらを置換にて一括消去をしたいのですが改行コードの入力方法がわかりません。
Windowsでしたら「Ctrl+J」で検索文字列の欄に入力できるようなのですがMacで行うと変な文字がでて当然ながら置換はできません。

セル中で「Control+Option+Return」にて改行を入力する事はできますが、これを上記の置換の検索文字列欄で行うと最終セルまで移動してしまうだけで置換はされません。

大量のデータで、しかも今後定期的な作業が必要となる為に途方にくれてます。
どなたか検索置換にて「検索文字列欄」に改行コードを入力する方法ご存じでしたら教えてください。
お願いいたします。

Aベストアンサー

残念ながらExcel2008はVBAが搭載されていないようです。

えっ!VBAがない?
http://officetanaka.net/excel/mac/tips02.htm

QCSVをVB(input)で読み込んだ場合に数値を文字列として読込みたい。

初めまして。個人的にVB6.0を勉強しています。教えてください。

【概要】
VBを使用し、CSVの読込(input #)→編集→TXTで出力(White #) する場合、inputの読込段階でデータが自動変換されてしまう。

【内容】
CSV(カンマ区切)のデータです。
(例)
シメイ,住所(都道府県),市街局番,番号
小林○○,千葉県○市○○,011,111-1111
佐藤○○,埼玉県○市○○,009,999-9999

input #で読込むと、市外局番の頭0(ゼロ)が省略され【11】や【9】と読込まれてしまう。
なんとか文字列として【011】や【009】と読込みたいです。

【奮闘記】
input #を使用し上記ファイルを+読込んでいます。
(line inputで読み込むと1列全てが結合された文字列となってしまうので、電話番号を結合するなど、編集ができなくなってしまうので)

input #として読込んだ段階で、数値として自動変換されてしまっているので、どうすればよいものなのか。。。
どんなアドバイスでも助かります!!よろしくお願いします。

初めまして。個人的にVB6.0を勉強しています。教えてください。

【概要】
VBを使用し、CSVの読込(input #)→編集→TXTで出力(White #) する場合、inputの読込段階でデータが自動変換されてしまう。

【内容】
CSV(カンマ区切)のデータです。
(例)
シメイ,住所(都道府県),市街局番,番号
小林○○,千葉県○市○○,011,111-1111
佐藤○○,埼玉県○市○○,009,999-9999

input #で読込むと、市外局番の頭0(ゼロ)が省略され【11】や【9】と読込まれてしまう。
なんとか文字列として【011...続きを読む

Aベストアンサー

こんにちは。

> input #として読込んだ段階で、数値として自動変換されてしまっている
ということですが、受け取り変数をString型にすれば
問題ないと思います。

Sub TEST()
Const cnsFILENAME = "D:\TEMP\TEST_DATA.csv"
Dim intFF As Integer
Dim X(1 To 4) As String
intFF = FreeFile
Open cnsFILENAME For Input As #intFF
Do Until EOF(intFF)
Input #intFF, X(1), X(2), X(3), X(4)
Debug.Print "(1)=" & X(1) & ", (2)=" & X(2) & _
", (3)=" & X(3) & ", (4)=" & X(4)
Loop
Close #intFF
End Sub

こんにちは。

> input #として読込んだ段階で、数値として自動変換されてしまっている
ということですが、受け取り変数をString型にすれば
問題ないと思います。

Sub TEST()
Const cnsFILENAME = "D:\TEMP\TEST_DATA.csv"
Dim intFF As Integer
Dim X(1 To 4) As String
intFF = FreeFile
Open cnsFILENAME For Input As #intFF
Do Until EOF(intFF)
Input #intFF, X(1), X(2), X(3), X(4)
Debug.Print "(1)=" & X(1) & ", (2)=" & X(2) & _
...続きを読む


人気Q&Aランキング

おすすめ情報