C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: CSVファイル全体を配列に取り込む


(過去ログ 117 を表示中)

[トピック内 9 記事 (1 - 9 表示)]  << 0 >>

■69017 / inTopicNo.1)  CSVファイル全体を配列に取り込む
  
□投稿者/ Djokovic (6回)-(2013/11/28(Thu) 16:24:13)

分類:[VB.NET/VB2005 以降] 

よろしくお願い致します。

.net VB 2010を使用しています。

CSVファイルを下記で、読み込んでいます。
strArray に、1行目であれば次のようにデータも入ってきます。

strArray(0)="A1"
strArray(1)="A2"
strArray(2)="A3"

strArrayには、その行のデータしか入ってきませんが、CSVファイル全体をAllBufに2次元配列で取り込みたいのです。

AllBuf(0)=strArray(あくまでもイメージ)で、1行分のデータstrArrayを AllBuf(n)に渡すようなことをしたいのですが
それは、どのように実現可能でしょうか?また、できるのでしょうか?


行は可変なので決め打ちができない。また、配列の1次元目は可変にすることができず、悩んでいます。
現在、AllBuf(行,列)を考えていますが、最悪はAllBuf(列,行)にしようかとも思っています。


例にあげたCSVファイルは3列ですが、5列や6列のCSVファイルもあり、1行目をSplitした時に列数は決定します。
同一のCSVファイルであれば、ある行は3列、ある行は5列などはありません。全ての行が同じ列数です。

お知恵拝借、よろしくお願い致します。


Sub Main()
Dim strBuffer As String = ""
Dim nFile As Integer = 0
Dim strArray() As String = Nothing

nFile = FreeFile()

FileOpen(nFile, "C:\temp\Test.csv", OpenMode.Input)

While Not (EOF(nFile))
strBuffer = LineInput(nFile)

strArray = Split(strBuffer, ",")

End While
FileClose()

End Sub


<CSVファイルの内容>

A1,A2,A3
B1,B2,B3



Z1,Z2,Z3
引用返信 編集キー/
■69018 / inTopicNo.2)  Re[1]: CSVファイル全体を配列に取り込む
□投稿者/ shu (438回)-(2013/11/28(Thu) 16:49:38)
2013/11/28(Thu) 16:49:59 編集(投稿者)
No69017 (Djokovic さん) に返信


VB 2010の割に構文はVB6までの内容ですね。


2次元配列に拘らないのなら

Imports System.IO

・・・

        Dim lines = (From line In File.ReadAllLines("d:\temp\test.csv")
                     Select line.Split(","c)).ToList


これでlinesに各行の内容が配列に入ったもののリストが作成されます。

lines(row)(col)  でrow行目のcol列目が取得出来ます。(0始まりです。)

引用返信 編集キー/
■69020 / inTopicNo.3)  Re[1]: CSVファイル全体を配列に取り込む
□投稿者/ 魔界の仮面弁士 (441回)-(2013/11/28(Thu) 17:00:42)
No69017 (Djokovic さん) に返信
> .net VB 2010を使用しています。
構文こそ VB.NET のそれながら、何故かとっても旧VBっぽい。

> strArrayには、その行のデータしか入ってきませんが、CSVファイル全体をAllBufに2次元配列で取り込みたいのです。
2 次元配列に拘らないのであれば、ジャグ配列(配列の配列)にするのが簡単かと。

Dim csv()() As String = System.IO.File.ReadLines("C:\temp\test.csv", _
 System.Text.Encoding.GetEncoding("Shift_JIS")).Select(Function(s) s.Split(",")).ToArray()



もし、それをさらに二次元配列化するとなると、
再加工のためにループ処理が必要になりそうです。


Dim maxRow As Integer = csv.Length
Dim maxCol As Integer = csv.Max(Function(line) line.Length)

Dim AllBuf(maxCol - 1, maxRow - 1) As String

For y = 0 To maxRow - 1
 For x = 0 To csv(y).Length - 1
  AllBuf(x, y) = csv(y)(x)
 Next
Next
引用返信 編集キー/
■69021 / inTopicNo.4)  Re[1]: CSVファイル全体を配列に取り込む
□投稿者/ an (4回)-(2013/11/28(Thu) 17:06:00)
No69017 (Djokovic さん) に返信

>AllBufに2次元配列で取り込みたいのです。

どうしても2次元配列じゃなきゃダメで、

> 1行目をSplitした時に列数は決定します。

これが前提条件なら

★変数宣言箇所に
Dim AllBuf(,) As String
Dim i As Integer = 0

★strArray取得後に
ReDim Preserve AllBuf(strArray.Length - 1, i)
For n As Integer = 0 To strArray.Length - 1
AllBuf(n, i) = strArray(n)
Next
i += 1

でいけると思います。



しかし、2次元配列よりは個人的には
 http://dobon.net/vb/dotnet/file/readcsvfile.html
ここを参考(特にTextFieldParserクラス)にした方が良いかと思います。
(使用している構文(LineInput等)が.net的ではないようですし・・・。)


引用返信 編集キー/
■69022 / inTopicNo.5)  Re[2]: CSVファイル全体を配列に取り込む
□投稿者/ Djokovic (7回)-(2013/11/28(Thu) 17:43:22)
shu さん
魔界の仮面弁士 さん

ありがとうございます。
数行でできてしまうのですね。
何か関数を作ろうかと思っていました・・・

VB6の匂いがプンプンするのは、.netに移行したばかりで、まだ分かっていないからです。
他の方が作ったプログラムを見ながら、.netぽくしていきます。

次のように書いてみたところ、データが入ってきました。
どうもありがとうございます。

stFilePath = System.IO.Path.Combine(strRDBMSDir, strAllRDBMS(intI, cintItemConf))

Dim strCsvfData()() As String = System.IO.File.ReadLines(stFilePath, _
System.Text.Encoding.GetEncoding("Shift_JIS")).Select(Function(s) s.Split(",")).ToArray()



あと、1つ質問です。
あるCSVファイル↓です。

M0001,Good,"SELECT Time, [TEMP2308.PV] from grp2"
M0002,Bad,"SELECT Time, [KERO95] from grp40"

select文の Time, [TEMP2308.PV] 部分の , も区切りとして読み込んできました。
これは、対応可能なのでしょうか?
Select文は、""で、囲まれてはいますが・・・

よろしくお願い致します。
引用返信 編集キー/
■69023 / inTopicNo.6)  Re[1]: CSVファイル全体を配列に取り込む
□投稿者/ WebSurfer (93回)-(2013/11/28(Thu) 17:57:25)
No69017 (Djokovic さん) に返信
> よろしくお願い致します。
>
> .net VB 2010を使用しています。
>
> CSVファイルを下記で、読み込んでいます。
> strArray に、1行目であれば次のようにデータも入ってきます。
>
> strArray(0)="A1"
> strArray(1)="A2"
> strArray(2)="A3"
>
> strArrayには、その行のデータしか入ってきませんが、CSVファイル全体をAllBufに2次元配列で取り込みたいのです。

質問の直接の答えにはなっていませんが・・・

質問者さんのコードでは、改行コードやデリミタ(質問者さんの例ではコンマ)
がフィールド値の中にあったらうまく行かないですよね。

そのような CSV ファイルの処置も可能な A Fast CSV Reader, TextFieldParser
などの既存 CSV パーサーを使ってはいかがですか?

各行を string 型の配列として取得できるので、全体を2次元配列にするのは
それほど難しいことはないはずです。

具体例としては以下のページが参考になりませんか? DataTable に格納すると
ころを少し変えれば2次元配列にするという目的は叶いそうです。

CSV パーサー
http://surferonwww.info/BlogEngine/post/2010/10/28/CSV-parser.aspx

引用返信 編集キー/
■69024 / inTopicNo.7)  Re[3]: CSVファイル全体を配列に取り込む
□投稿者/ 魔界の仮面弁士 (442回)-(2013/11/28(Thu) 18:21:46)
No69022 (Djokovic さん) に返信
> Select文は、""で、囲まれてはいますが・・・

an さんが紹介されている、dobon! さんのところの対処方法をご覧ください。
もし、ダブルコーテーションも含めて取り出したいのであれば、
http://bbs.wankuma.com/index.cgi?mode=al2&namber=68365&KLOG=116
などが参考になるかもしれません。


> これは、対応可能なのでしょうか?
対応は可能ですが、それを言い出すと、

--------------------------------------
SELECT ID, PostDate FROM Table1 WHERE Note = 'これは"1行目"のデータ
これは"2行目"のデータ'
--------------------------------------

のように、「"」「,」「改行」を含む SQL があったらどうするのか、などのように
いろいろと際限が無くなってしまいます。

修正作業を施すのであれば、最初にあらかじめ、仕様を厳密に定めておいたほうが良いですよ。


> あるCSVファイル↓です。

カンマ等を含んだデータ以外で厄介なパターンとしては:

・行ごとに列数が異なっているものや、途中に空の行がある場合など
・「"もデータの一部とみなすタイプ」と「"で囲ったり囲まなかったりするタイプ」と「常に"で囲むタイプ」
・レコード区切りの改行が「各レコードの末尾にあるタイプ」と「レコードとレコードの間にしかないタイプ」
・固定長レコードな CSV(文字数で固定長な場合、バイト数で固定長な場合)
・処理系を跨ぐ際に文字コード変換が必要になる場合(重複文字の扱いや、機種依存文字など)。
引用返信 編集キー/
■69025 / inTopicNo.8)  Re[3]: CSVファイル全体を配列に取り込む
□投稿者/ WebSurfer (94回)-(2013/11/28(Thu) 18:53:24)
No69022 (Djokovic さん) に返信


使用言語は VB.NET でしたね。先に紹介したページのサンプルは C# ですので、
C# が読めない場合は、以下のサイトなどのサービスを利用して変換してくだ
さい。

Convert C# to VB.NET
http://www.developerfusion.com/tools/convert/csharp-to-vb/

100% 完璧ではないですが、人間が読むには全く支障ないレベルにはなるはず
です。
引用返信 編集キー/
■69038 / inTopicNo.9)  Re[2]: CSVファイル全体を配列に取り込む
□投稿者/ Djokovic (8回)-(2013/11/29(Fri) 11:12:50)
最初にまず、anさん申し訳ありません。& ありがとうございます。

shu さん、魔界の仮面弁士 さんのご回答を見ながら、コーディングしていたの
で、アップデートしていなかったようでanさんのご回答に昨日気が付きませんで
した。


また、WebSurferさん、魔界の仮面弁士 さん、サイトのご紹介ありがとうござい
ます。

TextFieldParserを使用して、希望の通り取り込めました。
これで行くことします。

みなさま、本当にありがとうございます。

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -