タイトル | : Re^5: CSVを読み込みたい |
記事No | : 12118 |
投稿日 | : 2023/02/20(Mon) 10:33 |
投稿者 | : 魔界の仮面弁士 |
> > 「Provider=Microsoft.Jet.OLEDB.4.0; Data Source=C:\txtFilesFolder\; Extended Properties="text;HDR=Yes;FMT=Fixed";」 > > 「Provider=Microsoft.Jet.OLEDB.4.0; Data Source=C:\tsvFilesFolder\; Extended Properties="text;HDR=No;FMT=TabDelimited";」 > これって、「ACE」に対しても同じ書き方で大丈夫でしょうか?
同じ書き方で大丈夫です。 Jet Provider から ACE Providre になっても、CSV 読み書きの仕様は基本的には変わらないです。
Jet 3.51 → Jet 4.0 あたりのタイミングで、指定可能な拡張子に制限が加えられもしましたが、 現行 OS にとってみれば、実質的な違いは無いはず。
なお、拡張子制限については下記を参照してください。 https://support.microsoft.com/ja-jp/topic/0c4042f2-9f1d-f762-d95c-41f19d21bcce
Text IISAM は、データベース操作によって「テキストファイルへの書き込み」が 行えてしまうという特性から、制限が加えられたという事情によるものです。
CSV 以外の面で、Jet から ACE に乗り換える場合に気にするとすれば、このあたりかな。
(1) 対応するデータベースバージョンの変化(*.mdb、*.accdb) - Jet 3.51 … Version 1.0 / 1.1 / 2.0 / 3.0 / 3.5x への接続が可能 - Jet 4.0 … Version 1.0 / 1.1 / 2.0 / 3.0 / 3.5x / 4.0 への接続が可能 - ACE 12 … Version 1.0 / 1.1 / 2.0 / 3.0 / 3.5x / 4.0 / ACE への接続が可能 - ACE 14 … 3.x / 4.0 / ACE のみのサポート (1.0〜2.0 はサポートされない) - ACE 15/16 … 4.0 / ACE のみのサポート (1.0〜3.x はサポートされない)
(2) *.xlsx 形式の Excel ファイルの読み書きをサポート(Extended Properties="Excel 12.0 Xml;") ※ *.xls 形式も引き続き扱えます。
> 外部ライブラリ導入についてはハードルが高そうです。 Jet 4.0 Provider や ACE Provider も、OS 標準機能では無いですけれどね。
.NET Framework の標準ライブラリだけという話なら、 Microsoft.VisualBasic.FileIO.TextFieldParser クラス を使う手もあります。ただしこのクラスは、セル内に連続した改行があった場合に、 空白行が失われるという制限があるため、個人的には他のパーサーを使った方が安全だと思います。
一方、「セル内改行」「セル内カンマ」などのパターンが無いのであれば、 「改行」で行単位に分割 → 「,」で列単位に分割 → (必要なら)両端の「"」を除去 だけで済みます。
Imports System.IO Imports System.Text Imports System.Linq Imports System.Text.RegularExpressions Public Class Form1 Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click ' http://jusyo.jp/csv/new.php Dim csvFile As String = "C:\CSV\47okinaw.csv" Dim csvData()() = ReadCsv(csvFile).ToArray()
Dim tbl As New DataTable("沖縄") For Each column In csvData(0) tbl.Columns.Add(column, GetType(String)) Next For Each columns In csvData.Skip(1) tbl.Rows.Add(columns.Cast(Of Object)().ToArray()) Next tbl.AcceptChanges()
Me.DataGridView1.DataSource = tbl End Sub
Public Iterator Function ReadCsv(fileName As String) As IEnumerable(Of String()) For Each line In File.ReadLines(fileName, Encoding.GetEncoding("Shift_JIS")) 'Yield line.Split(","c).ToArray() Yield line.Split(","c).Select(AddressOf TrimQuote).ToArray() Next End Function
'「"abc"」を「abc」に切り捨てる Private Function TrimQuote(s As String) As String 'Return ("" & s).Trim(""""c) Return If(Regex.IsMatch(s & "", "^"".*"""), s.Substring(1, s.Length - 2), s) End Function End Class
|