Tham số chuỗi kết nối cho nguồn tệp văn bản
Trong bài viết trước, tôi đã đề cập đến các tham số chuỗi kết nối cho nguồn dữ liệu Excel. Bây giờ chúng ta sẽ tập trung vào các tệp văn bản. Có các phương pháp khác nhau để mô tả giản đồ của tệp văn bản và sử dụng thông tin trong khi mở hoặc liên kết trong Access. Mặc dù bảng tính Excel có một số điểm tương đồng về cấu trúc, nhưng điều này không đúng với các tệp văn bản. Chúng tôi phải trả lời một số câu hỏi về cấu trúc của tệp văn bản bao gồm:
- Nó được phân cách hay chiều rộng cố định?
- Làm cách nào để biết khi nào một cột kết thúc và cột khác bắt đầu?
- Văn bản có được trích dẫn hay không?
- Chúng ta nên phân tích ngày và giờ như thế nào?
- Còn về số tiền thì sao? Chúng nên được định dạng như thế nào?
và có thể hơn thế nữa. Mặc dù nhìn sơ qua thì CSV có vẻ được xác định rõ ràng nhưng khi bạn tìm hiểu kỹ, nó thực sự được xác định rất lỏng lẻo. Không có thỏa thuận chung nào về việc có nên trích dẫn văn bản hay không, ngày tháng nên được định dạng như thế nào. Vì tất cả những lý do đó, việc sử dụng tệp văn bản thường yêu cầu sử dụng một số loại thông tin lược đồ để mô tả cấu trúc của tệp văn bản. Có ba cách để lưu trữ thông tin giản đồ:
- Một
schema.ini
tệp được lưu trữ trong một thư mục - Truy cập
MSysIMEX
vàMSysIMEXColumns
bảng - Access ’
ImportExportSpecification.XML
tài sản.
Để làm phức tạp vấn đề, có một số phương pháp khác nhau mà chúng ta có thể sử dụng để làm việc với tệp văn bản nhưng không phải tất cả các phương pháp đều có thể sử dụng cả 3 cách khác nhau để lấy thông tin lược đồ. Ví dụ:DoCmd.TransferText
hoạt động với các bảng hệ thống nhưng không lưu nhập / xuất. Mặt khác, DoCmd.RunSavedImportExport
hoạt động với ImportExportSpecification
vật. Tuy nhiên, ImportExportSpecification
không được sử dụng như một phần của liên kết. Vì vậy, đối với cuộc thảo luận của chúng tôi, chúng tôi thực sự chỉ có 2 phương pháp khả dụng trong ngữ cảnh mở hoặc liên kết đến một tệp văn bản. Điều quan trọng cần lưu ý là sự phân biệt giữa việc lưu thông số kỹ thuật vào MSysIMEXSpecs
&MSysIMEXColumns
bảng so với lưu nhập / xuất trở thành ImportExportSpecification
vật. Chúng ta sẽ tìm hiểu 2 phương pháp đó trong các bài viết tiếp theo.
Chuỗi kết nối cho tệp văn bản
Chúng ta nên xem xét cách Access sẽ cảm nhận một tệp văn bản. Trong phần trước, chúng ta đã thấy rằng mỗi trang tính hoặc một dải ô được đặt tên được biểu diễn dưới dạng “bảng” trong “cơ sở dữ liệu” bảng tính Excel. Nhưng một tệp văn bản không có cấu trúc như vậy. Điều gì tạo nên một “cơ sở dữ liệu” sau đó? Câu trả lời là thư mục đại diện cho một “cơ sở dữ liệu” và do đó bất kỳ tệp văn bản nào trong một thư mục đều là “bảng”. Vì lý do đó, có thể có nhiều thông tin lược đồ cho cùng một thư mục nếu thư mục đó chứa nhiều hơn một định dạng khả thi cho bất kỳ tệp văn bản nào được lưu trữ trong thư mục. Sau đó, bạn sẽ thấy rằng khi chúng tôi tạo chuỗi kết nối, chúng tôi liên kết đến thư mục, sau đó truy cập tệp riêng lẻ dưới dạng bảng.
Do đó, sử dụng thiết lập này như được hiển thị:
Sau đó, chúng tôi có thể mở một tệp văn bản bằng mã VBA sau:
Dim db As DAO.Database Set db = DBEngine.OpenDatabase(vbNullString, False, False, "Text;DATABASE=C:\Links") Dim tdf As DAO.TableDef For Each tdf In db.TableDefs Debug.Print tdf.Name Dim fld As DAO.Field For Each fld In tdf.Fields Debug.Print fld.Name, Next Debug.Print Dim rs As DAO.Recordset Set rs = tdf.OpenRecordset Do Until rs.EOF For Each fld In rs.Fields Debug.Print fld.Value, Next Debug.Print rs.MoveNext Loop Debug.Print Next
Điều này sẽ mang lại kết quả đầu ra:
Products#csv Products Count PackDate Amount ShipDate Apples 3 12/4/2020 $ 1.02 4/12/2020 Bananas 5 4/12/2020 $ 1,234.56 12/4/2020 Figs 8 5/7/2020 $ 0.01 7/5/2020 Grapes 11 10/10/2020 $12.30 10/10/2020
Hãy lưu ý những điều sau:
- Chúng tôi đã không chỉ định tệp văn bản trong chuỗi kết nối của mình. Thay vào đó, chúng tôi đã sử dụng thư mục.
- Tên của "bảng" đã được thay đổi do dấu chấm trong tên không phải là ký tự hợp lệ. Ergo,
products.csv
đã trở thànhproducts#csv
. - So với Excel, không có tham số bắt buộc nào ngoài việc chỉ định trình điều khiển tệp văn bản và đường dẫn đến thư mục.
Trong phần tiếp theo, bạn sẽ tìm hiểu thêm về cách mô tả lược đồ của tệp văn bản. Tuy nhiên, đối với chính chuỗi kết nối, các từ khóa sau được nhận dạng.
FMT
tham số:Cho biết định dạng của tệp văn bản.
Delimited
:Tệp được phân cách bằng một ký tự. Ký tự được sử dụng được chỉ định bởi thông tin lược đồ.
Fixed
:Tệp có chiều rộng cố định cho (các) cột. Một lần nữa, (các) chiều rộng cột cụ thể được chỉ định bởi thông tin lược đồ.
HDR
tham số:Hàng tiêu đề
YES
:Hàng đầu tiên là tiêu đề và phải trở thành tên cột cho “bảng” / ”tập bản ghi”
NO
:Hàng đầu tiên không được xử lý khác và chỉ là một dữ liệu. Tất cả các tên cột sẽ được đặt tên là “FN” trong đó “N” là một số bắt đầu bằng 1
IMEX
tham số:Hành vi Nhập / Xuất
Điều này chi phối cách xác định các kiểu dữ liệu cột, dựa trên nội dung:
1
:Nếu cột chứa các kiểu dữ liệu khác nhau, hãy coi nó như một chuỗi. Nếu không, hãy đối sánh cột với kiểu dữ liệu tốt nhất.
2
:Luôn khớp cột với một kiểu dữ liệu nhất định dựa trên mẫu. Điều đó có thể gây ra lỗi đọc khi chúng tôi đọc một hàng chứa dữ liệu không khớp với kiểu dữ liệu mong đợi.
ACCDB
tham số:Cho biết Access đang sử dụng định dạng tệp ACCDB?
Theo mặc định, điều này luôn được đặt ACCDB =YES ở định dạng tệp accdb. Tuy nhiên, việc bỏ qua hoặc đặt thành KHÔNG dường như không làm được gì. Đó là một chút bí ẩn. Nếu ai đó có thể chia sẻ tác dụng của thông số này, hãy đăng nhận xét và tôi sẽ cập nhật blog.
DATABASE
tham số:Đường dẫn đến thư mục chứa các tệp văn bản
Tham số phải chứa một đường dẫn đủ điều kiện. Nó không được bao gồm tên của các tệp văn bản.
CharacterSet
Tham số:Xác định mã hóa ký tự để sử dụng để đọc các tệp văn bản.
Điều này sẽ được thảo luận chi tiết hơn trong bài viết tiếp theo. Điều này cũng có thể được mô tả trong thông tin lược đồ.
DSN
Tham số:Xác định thông tin giản đồ để sử dụng với tệp văn bản.
Tên phải tương ứng với MSysIMEXSpec
, sẽ được phân tích trong bài viết sau. Điều này chỉ hoạt động với MSysIMEX***
những cái bàn. Nếu bạn muốn sử dụng schema.ini
, bạn chỉ cần không bao gồm bất kỳ DSN
nào trong chuỗi kết nối của bạn.
Điều quan trọng cần lưu ý là trình điều khiển tệp văn bản sẽ chỉ xem xét các tham số được liệt kê ở trên. Không thể đặt các từ khóa khác và phải phân tích cú pháp từ trình điều khiển tệp văn bản. Vì lý do đó, bạn sẽ không thể chỉ định tất cả các chi tiết về tệp văn bản chỉ từ chuỗi kết nối.
Lược đồ mặc định cho tệp văn bản
Về lý thuyết, bạn có thể mở hoặc liên kết một tệp văn bản mà không có bất kỳ thông tin lược đồ nào nhưng điều này sẽ hiếm khi hoạt động. Trong tình huống này, Access sẽ chỉ đơn giản là giả định các giá trị mặc định cho các tùy chọn khác nhau. Nếu tệp văn bản tuân theo tất cả các giá trị mặc định hiện tại thì Access sẽ thành công trong việc đọc tệp. Quan trọng hơn, việc không có lỗi khi mở hoặc liên kết với tệp văn bản không có nghĩa là dữ liệu được biểu diễn một cách có ý nghĩa. Ví dụ:số tiền tiền tệ được định dạng đặc biệt có thể được hiểu là văn bản chứ không phải tiền tệ và văn bản không được phân tách bằng dấu phẩy trong văn bản có thể được phân tích cú pháp sai, thêm các cột không mong muốn. Các giá trị mặc định được xác định ở hai nơi có thể:
- Access sẽ xem xét cài đặt đăng ký. Để cài đặt Office 365, sổ đăng ký có thể được đặt tại:
Computer\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\ClickToRun\REGISTRY\MACHINE\Software\Microsoft\Office\16.0\Access Connectivity Engine\Engines\Text
. Chúng tôi sẽ gọi vị trí này là “Khóa đăng ký văn bản” trong các bài viết tiếp theo. - Các cài đặt bạn sẽ thấy trong
Region
applet trong bảng điều khiển của Windows. Chúng tôi sẽ gọi vị trí này là “Cài đặt Windows”.
Lưu ý về mã hóa cho các tệp văn bản
Bắt buộc phải có mã hóa chính xác bất kể bạn có thể sử dụng phương pháp nào để truy cập tệp văn bản của mình. Khi nội dung tệp văn bản của bạn bị hạn chế chỉ với các ký tự trong nửa dưới của điểm ASCII (ví dụ:0-127), thì việc bạn chọn kiểu mã hóa nào cho tệp văn bản của mình hầu như không quan trọng. Giá trị mặc định thường đủ tốt. Tuy nhiên, nếu các tệp văn bản của bạn có thể chứa bất kỳ Unicode nào hoặc bất kỳ ký tự nào lớn hơn 127, thì bạn, nhà phát triển, phải biết mã hóa. Nếu mã hóa sai được chỉ định, văn bản có thể không được nhập như mong đợi và sẽ không gây ra bất kỳ lỗi nào. Đối với những chi tiết lộn xộn, tôi sẽ giới thiệu bạn với Joel Spolsky về vấn đề này.
Lựa chọn giữa schema.ini
và MSysIMEX***
bảng
Như bạn sẽ thấy trong các bài viết tiếp theo, cả hai phương pháp đều có sự trùng lặp khá lớn về khả năng. Do đó, bạn có thể thấy mình phải lựa chọn sử dụng một trong hai. Sự khác biệt chính nằm ở việc bạn muốn lược đồ được lưu trữ trong ứng dụng của mình hay trong một thư mục chứa các tệp văn bản. Khi bạn sử dụng schema.ini
, bạn đang giả định rằng các tệp văn bản sẽ có trong một thư mục nhất định và sẽ có một tên nhất định.
Với MSysIMEX***
, bạn có thể xử lý bất kỳ tệp văn bản nào từ bất kỳ đâu đơn giản bằng cách tham khảo thông số kỹ thuật đã xác định. Tuy nhiên, không dễ để chỉnh sửa đặc tả bên ngoài Access. Ngay cả trong Access, thật không dễ dàng để điều chỉnh các thông số kỹ thuật bằng giao diện người dùng. schema.ini
có một số tính năng bổ sung không có sẵn trực tiếp với MSysIMEX***
bảng.
Tuy nhiên, câu hỏi về nơi lưu trữ thông số kỹ thuật rất có thể sẽ là yếu tố quan trọng nhất của bạn trong việc quyết định sử dụng cái nào.
Kết luận
Chúng tôi đặc biệt khuyến khích bạn xác định thông tin lược đồ cho bất kỳ tệp văn bản nào có chứa ngày tháng hoặc số tiền. Ngày tháng và số lượng tiền tệ nhạy cảm với cài đặt khu vực có thể ảnh hưởng đến việc phân tích dữ liệu chính xác. Bởi vì chúng tôi có hai hệ thống khác nhau với các tập hợp tùy chọn có sẵn khác nhau, chúng tôi phải xem xét từng hệ thống trong các bài viết tiếp theo. Bạn có thể lựa chọn sử dụng một trong hai (hoặc thậm chí cả hai giữa các tệp văn bản khác nhau). Bây giờ chúng ta sẽ chuyển sang schema.ini
trong bài viết tiếp theo. Sau đó chúng ta sẽ xem xét MSysIMEX***
các bảng trong bài viết sau.