<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
		>
<channel>
	<title>Комментарии: Парсим csv и tsv файлы в delphi</title>
	<atom:link href="http://parsers.info/2010/01/parsim-csv-i-tsv-v-delphi/feed/" rel="self" type="application/rss+xml" />
	<link>http://parsers.info/2010/01/parsim-csv-i-tsv-v-delphi/</link>
	<description>Delphi блог Димаса: программирование на delphi, парсеры, статьи, размышления</description>
	<lastBuildDate>Sun, 29 Apr 2012 09:22:01 +0000</lastBuildDate>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
	<item>
		<title>Автор: Artur Mstafin</title>
		<link>http://parsers.info/2010/01/parsim-csv-i-tsv-v-delphi/comment-page-1/#comment-222722</link>
		<dc:creator>Artur Mstafin</dc:creator>
		<pubDate>Fri, 17 Feb 2012 03:15:45 +0000</pubDate>
		<guid isPermaLink="false">http://parsers.info/?p=505#comment-222722</guid>
		<description>&lt;code&gt;
procedure TForm1.Button1Click(Sender: TObject);
var
  sdata, srow: TStrings;
  i:integer;
begin
  sdata:=TStringList.Create;
  srow:=TStringList.Create;
  srow.Delimiter:=&#039;,&#039;;
  &lt;strong&gt;srow.StrictDelimiter:=&#039;True;&lt;/strong&gt;
  sdata.LoadFromFile(&#039;c:\table.csv&#039;);
  StringGrid1.RowCount:=sdata.Count;
  for i:=0 to sdata.Count-1 do begin
    srow.DelimitedText:=sdata[i];
    if srow.Count&gt;StringGrid1.ColCount then
      StringGrid1.ColCount:=srow.Count;
    StringGrid1.Rows[i].Assign(srow);
  end;
  srow.Free;
  sdata.Free;
end;
&lt;/code&gt;</description>
		<content:encoded><![CDATA[<p><code><br />
procedure TForm1.Button1Click(Sender: TObject);<br />
var<br />
  sdata, srow: TStrings;<br />
  i:integer;<br />
begin<br />
  sdata:=TStringList.Create;<br />
  srow:=TStringList.Create;<br />
  srow.Delimiter:=',';<br />
  <strong>srow.StrictDelimiter:='True;</strong><br />
  sdata.LoadFromFile('c:\table.csv');<br />
  StringGrid1.RowCount:=sdata.Count;<br />
  for i:=0 to sdata.Count-1 do begin<br />
    srow.DelimitedText:=sdata[i];<br />
    if srow.Count&gt;StringGrid1.ColCount then<br />
      StringGrid1.ColCount:=srow.Count;<br />
    StringGrid1.Rows[i].Assign(srow);<br />
  end;<br />
  srow.Free;<br />
  sdata.Free;<br />
end;<br />
</code></p>
]]></content:encoded>
	</item>
	<item>
		<title>Автор: tonyy</title>
		<link>http://parsers.info/2010/01/parsim-csv-i-tsv-v-delphi/comment-page-1/#comment-20414</link>
		<dc:creator>tonyy</dc:creator>
		<pubDate>Sat, 08 Jan 2011 10:36:35 +0000</pubDate>
		<guid isPermaLink="false">http://parsers.info/?p=505#comment-20414</guid>
		<description>проблема такого разделения tsv данных в том, что delimiter разбивает как по символу которому ты ему указываешь так и по пробелу. т. е указываешь разделить по табуляции, а он, ..., делит по табуляции и пробелу:(((((((((((((((((((((((((((((((((((((((((</description>
		<content:encoded><![CDATA[<p>проблема такого разделения tsv данных в том, что delimiter разбивает как по символу которому ты ему указываешь так и по пробелу. т. е указываешь разделить по табуляции, а он, &#8230;, делит по табуляции и пробелу:(((((((((((((((((((((((((((((((((((((((((</p>
]]></content:encoded>
	</item>
	<item>
		<title>Автор: crystalbit</title>
		<link>http://parsers.info/2010/01/parsim-csv-i-tsv-v-delphi/comment-page-1/#comment-19723</link>
		<dc:creator>crystalbit</dc:creator>
		<pubDate>Tue, 21 Dec 2010 20:29:47 +0000</pubDate>
		<guid isPermaLink="false">http://parsers.info/?p=505#comment-19723</guid>
		<description>щито?</description>
		<content:encoded><![CDATA[<p>щито?</p>
]]></content:encoded>
	</item>
	<item>
		<title>Автор: узе</title>
		<link>http://parsers.info/2010/01/parsim-csv-i-tsv-v-delphi/comment-page-1/#comment-19429</link>
		<dc:creator>узе</dc:creator>
		<pubDate>Mon, 13 Dec 2010 18:58:26 +0000</pubDate>
		<guid isPermaLink="false">http://parsers.info/?p=505#comment-19429</guid>
		<description>ваще то в дельфи пять ниококом делимитер ни слуху ни духу .. так что харош лошать ..</description>
		<content:encoded><![CDATA[<p>ваще то в дельфи пять ниококом делимитер ни слуху ни духу .. так что харош лошать ..</p>
]]></content:encoded>
	</item>
	<item>
		<title>Автор: crystalbit</title>
		<link>http://parsers.info/2010/01/parsim-csv-i-tsv-v-delphi/comment-page-1/#comment-17741</link>
		<dc:creator>crystalbit</dc:creator>
		<pubDate>Sat, 20 Nov 2010 18:37:04 +0000</pubDate>
		<guid isPermaLink="false">http://parsers.info/?p=505#comment-17741</guid>
		<description>спасибо за замечание, только прочитал и исправил) странно, что и так работало =)</description>
		<content:encoded><![CDATA[<p>спасибо за замечание, только прочитал и исправил) странно, что и так работало =)</p>
]]></content:encoded>
	</item>
	<item>
		<title>Автор: Вячеслав</title>
		<link>http://parsers.info/2010/01/parsim-csv-i-tsv-v-delphi/comment-page-1/#comment-13020</link>
		<dc:creator>Вячеслав</dc:creator>
		<pubDate>Tue, 26 Oct 2010 12:06:40 +0000</pubDate>
		<guid isPermaLink="false">http://parsers.info/?p=505#comment-13020</guid>
		<description>у тебя в коде примера ошибка.
когда назначаешь разделитель &quot;sdata.Delimiter:=&#039;,&#039;;&quot;-это не для того StringList, правильно будет вот так &quot;srow.Delimiter:=&#039;,&#039;;&quot;. Исправь пожалуста, не надо вводить людей в заблуждение)))))</description>
		<content:encoded><![CDATA[<p>у тебя в коде примера ошибка.<br />
когда назначаешь разделитель &laquo;sdata.Delimiter:=&#8217;,';&raquo;-это не для того StringList, правильно будет вот так &laquo;srow.Delimiter:=&#8217;,';&raquo;. Исправь пожалуста, не надо вводить людей в заблуждение)))))</p>
]]></content:encoded>
	</item>
	<item>
		<title>Автор: Артём</title>
		<link>http://parsers.info/2010/01/parsim-csv-i-tsv-v-delphi/comment-page-1/#comment-8773</link>
		<dc:creator>Артём</dc:creator>
		<pubDate>Wed, 16 Jun 2010 18:44:27 +0000</pubDate>
		<guid isPermaLink="false">http://parsers.info/?p=505#comment-8773</guid>
		<description>Ты знаешь я не чего не педрю но хочу научиться подскажи литературу по данному разделу</description>
		<content:encoded><![CDATA[<p>Ты знаешь я не чего не педрю но хочу научиться подскажи литературу по данному разделу</p>
]]></content:encoded>
	</item>
	<item>
		<title>Автор: Айван</title>
		<link>http://parsers.info/2010/01/parsim-csv-i-tsv-v-delphi/comment-page-1/#comment-5679</link>
		<dc:creator>Айван</dc:creator>
		<pubDate>Fri, 05 Mar 2010 15:45:48 +0000</pubDate>
		<guid isPermaLink="false">http://parsers.info/?p=505#comment-5679</guid>
		<description>Сам вначале долго программировал на 1Cv77. Как же я потом матерился в дельфи, когда искал аналог функции &quot;ИзСтрокиСразделителем&quot;, а потом пришлось ручками писать свой аналог. Зато теперь любой разделитель в качестве параметра задается и ву-аля :)</description>
		<content:encoded><![CDATA[<p>Сам вначале долго программировал на 1Cv77. Как же я потом матерился в дельфи, когда искал аналог функции &laquo;ИзСтрокиСразделителем&raquo;, а потом пришлось ручками писать свой аналог. Зато теперь любой разделитель в качестве параметра задается и ву-аля :)</p>
]]></content:encoded>
	</item>
	<item>
		<title>Автор: crystalbit</title>
		<link>http://parsers.info/2010/01/parsim-csv-i-tsv-v-delphi/comment-page-1/#comment-4230</link>
		<dc:creator>crystalbit</dc:creator>
		<pubDate>Wed, 13 Jan 2010 11:13:15 +0000</pubDate>
		<guid isPermaLink="false">http://parsers.info/?p=505#comment-4230</guid>
		<description>Соглашусь, TStringList - не самый оптимальный вариант, зато всё уже сделано за нас. А с небольшими таблицами скорость существенной роли не играет. 
Ваш алгоритм не столь сложен в реализации простых таблиц, немного придётся потрудиться в случае, когда каждый элемент заключен в кавычки (QuoteChar). В принципе, повод, чтобы написать модуль для работы с dsv на winapi :)</description>
		<content:encoded><![CDATA[<p>Соглашусь, TStringList &#8211; не самый оптимальный вариант, зато всё уже сделано за нас. А с небольшими таблицами скорость существенной роли не играет.<br />
Ваш алгоритм не столь сложен в реализации простых таблиц, немного придётся потрудиться в случае, когда каждый элемент заключен в кавычки (QuoteChar). В принципе, повод, чтобы написать модуль для работы с dsv на winapi :)</p>
]]></content:encoded>
	</item>
	<item>
		<title>Автор: Sergey</title>
		<link>http://parsers.info/2010/01/parsim-csv-i-tsv-v-delphi/comment-page-1/#comment-4221</link>
		<dc:creator>Sergey</dc:creator>
		<pubDate>Wed, 13 Jan 2010 03:11:20 +0000</pubDate>
		<guid isPermaLink="false">http://parsers.info/?p=505#comment-4221</guid>
		<description>Ну во первых, TStringList не самый быстрый способ распарсить строку Во вторых readln тоже не самый быстрый способ считывания csv файлов.
По вашему примеру алгоритм примерно таким будет:
1. readln считывает из файла по байтно ища разделитель строк
2. найденная строка передаётся в stringlist, который снова проверяет всю строку посимвольно и разделяет строку.
3. Каждый элемент stringlist копируется в ячейку grid

Тут однозначно можно провести небольшой апгрейд алгоритма, тобишь оптимизацию:
1. Считываем например 1000 байт из файла в память.
2. Посимвольно проверяем каждый байт ища указанный разделитель или разделитель строк.
3. Если найден csv-разделитель, то копируем найденную часть строки в ячейку grid
4. Если разделитель строк, то создаем новую строку в grid
5. Таким образом считываем весь файл.

Алгоритм конечно сложнее по реализации, но скорость парсинга dsv файлов вырастает на порядок (проверенно опытным путём).</description>
		<content:encoded><![CDATA[<p>Ну во первых, TStringList не самый быстрый способ распарсить строку Во вторых readln тоже не самый быстрый способ считывания csv файлов.<br />
По вашему примеру алгоритм примерно таким будет:<br />
1. readln считывает из файла по байтно ища разделитель строк<br />
2. найденная строка передаётся в stringlist, который снова проверяет всю строку посимвольно и разделяет строку.<br />
3. Каждый элемент stringlist копируется в ячейку grid</p>
<p>Тут однозначно можно провести небольшой апгрейд алгоритма, тобишь оптимизацию:<br />
1. Считываем например 1000 байт из файла в память.<br />
2. Посимвольно проверяем каждый байт ища указанный разделитель или разделитель строк.<br />
3. Если найден csv-разделитель, то копируем найденную часть строки в ячейку grid<br />
4. Если разделитель строк, то создаем новую строку в grid<br />
5. Таким образом считываем весь файл.</p>
<p>Алгоритм конечно сложнее по реализации, но скорость парсинга dsv файлов вырастает на порядок (проверенно опытным путём).</p>
]]></content:encoded>
	</item>
</channel>
</rss>

