Хотя ODBC – это программный интерфейс для баз данных, использование ODBC и предустановленного Microsoft Text ODBC driver открывает интересные возможности для обработки текстовых файлов (таких как txt и csv), благодаря тому, что SQL запросы типа SELECT могут быть применены к содержимому txt и csv файлов, как если бы это были таблицы базы данных!

Применение SELECT запросов для обработки данных предоставляет ряд преимуществ, которые доступны из командной строки и не требуют программирования!

  • обработка данных с учётом их типа — Integer, Date, Char и др.
  • сортировка строк выражением ORDER BY и группировка GROUP BY
  • выборка строк по условиям с поддержкой AND, OR и LIKE
  • агрегатные функции — минимальной, максимальное, среднее и суммарное значения (MIN, MAX, AVG, SUM)
  • выборка неповторяющихся значений выражением SELECT DISTINCT

В этой статье:

Строка подключения Microsoft Text Driver

Driver={Microsoft Text driver (*.txt; *.csv)};DBQ=C:\ProgramData\My Program\Data\;DriverId=27;MaxBufferSize=2048;PageTimeout=5

Параметр DBQ

Единственный обязательный параметер, он задаёт драйверу путь к файлам. Путь может содержать пробелы:

DBQ=C:\ProgramData\My Program\Data\;

Для подключения к текущему каталогу достаточно указать просто точку (.) вместо пути:

DBQ=.

Строка запуска программы nhdbt:

Подключение к текущему каталогу и выполнение одного SQL запроса:

nhdbt -cs:"driver={Microsoft Text driver (*.txt; *.csv)};dbq=." -q:"select count(*) from products;"

Подключение к текущему каталогу и выполнение SQL запросов из файла test.sql:

nhdbt -cs:"driver={Microsoft Text driver (*.txt; *.csv)};dbq=." -qf:test.sql

Файл Schema.ini для Microsoft Text Driver

Файл Schema.ini file необходим, чтобы драйвер правильно интерпретировал содержимое текстовых файлов.

Schema.ini File (Text File Driver)

When the Text driver is used, the format of the text file is determined by using a schema information file. The schema information file is always named Schema.ini and always kept in the same directory as the text data source. The schema information file provides the IISAM with information about the general format of the file, the column name and data type information, and several other data characteristics. A Schema.ini file is always required for accessing fixed-length data. You should use a Schema.ini file when your text table contains DateTime, Currency, or Decimal data, or any time that you want more control over the handling of the data in the table.

Пример Schema.ini для apache_access.csv:

[apache_access.csv]
Format=TabDelimited
ColNameHeader=false
CharacterSet=ANSI
Col1=IPAddress char width 15
Col2=AccessTime date
Col3=Request char width 250
Col4=Code Integer

Как только файл Schema.ini сохранён в папке, Microsoft Text драйвер может работать с файлами.

Формат полей даты и времени DateTime

Формат для даты и времени не описан в официальной документации Schema.ini File (Text File Driver), поэтому всегда вызывает вопросы.

По умолчанию, используется пользовательский короткий формат.

Например, для English US это dd/MM/yyyy HH:mm, также принимается dd/MM/yyyy HH:mm:ss. Поэтому обработка дат следующего лог файла будет работать только с региональными настройками English US:

70.69.152.165	02/22/2017 22:13:23	GET /blog/index.php HTTP/1.1...
128.196.108.201	02/22/2017 23:21:23	GET /favicon.ico HTTP/1.1...
147.106.118.104	02/22/2017 15:27:00	GET /company/ HTTP/1.1...

При других настройках, например, европейских или российских, считывание даты не произойдёт из-за несовпадения формата.

Формат даты и времени изменяется параметром DateTimeFormat. Заданный формат применяется ко всем полям даты и времени в эотм файле:

[apache_access.csv]
...
DateTimeFormat=mm/dd/yyyy hh:nn:ss
...

Обратите внимание, обозначение формата не совпадает с форматом, принятым в Windows:

  • nn используется вместо mm для обозначения минут
  • AM/PM не поддерживается, время всегда в 24-часовом формате
  • регистр не имеет значения
Формат US DateTimeFormat=mm/dd/yyyy hh:nn:ss
Европейский формат DateTimeFormat=dd/mm/yyyy hh:nn:ss
Российский формат DateTimeFormat=dd.mm.yyyy hh:nn:ss
Формат SQL DateTimeFormat=yyyy-mm-dd hh:nn:ss

Если формат считываемых данных не соответствует настройкам, драйвер использует значение NULL для этого поля.

Примеры

Ниже приведены примеры выполнения SQL запросов применительно к csv файлу с Tab-разделителями:

70.69.152.165	2017-02-22 19:39:27	GET /_media/logo_my_v2.png HTTP/1.1	304...
147.106.118.104	2017-02-22 18:00:37	GET /_css/master.1334356838.css HTTP/1.1	200...
65.98.119.36	2017-02-22 16:32:25	GET /_js/master.js HTTP/1.1	200...

Используется Schema.ini (необязательно прописывать все столбцы):

[apache_access.csv]
Format=TabDelimited
ColNameHeader=false
CharacterSet=ANSI
DateTimeFormat=yyyy-mm-dd hh:nn:ss
Col1=IPAddress char width 15
Col2=AccessTime date
Col3=Request char width 250
Col4=Code Integer

Программа nhdbt используется для тестирования. Все файлы можно скачать по ссылке внизу страницы.

Определить количество строк

SELECT COUNT возвращает число строк в файле-таблице.

Как определить число всех строк в файле:

select count(*) from apache_access.csv
   Expr1000 
----------- 
       9946 

Как определить число строк, сгруппированное по коду (поле Code):

select Code,count(Code) from apache_access.csv group by Code order by Code
       Code    Expr1001 
----------- ----------- 
        200        7059 
        302         407 
        304        1525 
        401         224 
        403           5 
        404         527 
        500          75 
        503         124

Определение суммарных значений значение

Как определить минимальное и максимально значение поля по всему файлу:

select min(AccessTime),max(AccessTime) from apache_access.csv
Expr1000            Expr1001            
------------------- ------------------- 
2017-02-22 15:00:22 2017-02-22 23:33:31

Функции AVG и SUM тоже поддерживаются (для Integer).

Считать неповторяющиеся значения

Как получить только различные значения IP адресов с сортировкой:

select distinct(IPAddress) from apache_access.csv order by IPAddress asc
IPAddress       
--------------- 
101.92.120.16   
128.196.108.201 
14.47.165.89    
147.106.118.104 
161.71.8.142    
19.174.45.8     
221.125.19.252  
30.75.225.192   
34.87.4.6       
46.139.54.184   
5.35.225.115    
52.87.131.109   
65.98.119.36    
70.69.152.165   
78.235.33.64    

Поиск по текстовым значениям

Как выделить пользователей Windows:

select distinct(UserAgent) from apache_access.csv where UserAgent like '%Windows%'
UserAgent                                                                                                                                                                                                                                                       
------------------------------------------------------------------------------------------------------------
Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:23.0) Gecko/20131011 Firefox/23.0                               
Mozilla/5.0 (Windows NT 6.2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1467.0 Safari/537.36        
Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/4.0; InfoPath.2; SV1; .NET CLR 2.0.50727; WOW64)

Как выделить использующих Opera:

select distinct(UserAgent) from apache_access.csv where UserAgent like '%Opera%'
UserAgent                                                                                                                                                                                                                                                       
-------------------------------------------------------------------------------------
Opera/9.80 (iPad; Opera Mini/7.1.32694/27.1407; U; en) Presto/2.8.119 Version/11.10
Opera/9.80 (iPhone; Opera Mini/7.1.32694/27.1407; U; en) Presto/2.8.119 Version/11.10

Ограничения

Строка с разделителями может содержать одно или несколько значений, с разделителями между ними: запятая, tab или другой символ. Выбранный разделитель используется во всём файле.
Таблицы могут включать максимум 255 столбцов. Названия полей ограничиваются 64 символами, ширина поля ограничена 32 766 символами. Размер записи ограничен 65,000 байтами.

Текстовый файл может быть открыт только для одного пользователя. Несколько пользователей не поддерживается.

Для txt и csv файлов драйвер не поддерживает кодировки Unicode, такие как UTF-8 или UCS2, можно задавать или ANSI, или OEM.

Файлы для загрузки

Все файлы, включая log файл, Schema.ini, SQL запросы, test.cmd и nhdbt.exe доступны для загрузки с Google Drive:
processing-text-files-with-microsoft-text-driver.zip

Узнать больше

Статьи о Microsoft Text driver на Microsoft:
Schema.ini File (Text File Driver)
Text File Format (Text File Driver)

nhdbt – бесплатная программа для Windows, выполняющая SQL запросы из командной строки.

Текстовые файлы в Microsoft Text driver

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *