<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[Серый форум &mdash; 1Cv8: чтение больших текстовых файлов (csv)]]></title>
		<link>http://forum.script-coding.com/viewtopic.php?id=5664</link>
		<atom:link href="http://forum.script-coding.com/extern.php?action=feed&amp;tid=5664&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «1Cv8: чтение больших текстовых файлов (csv)».]]></description>
		<lastBuildDate>Tue, 29 Mar 2011 09:56:17 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: 1Cv8: чтение больших текстовых файлов (csv)]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=47085#p47085</link>
			<description><![CDATA[<p>Другой способ. Скачиваем пакет <a href="http://main.1c-ei.ru/Home/versions">Enterprise Integrator&amp;#8206;</a> (для нужного нам здесь функционала он бесплатен), устанавливаем из него единственный компонент &quot;GameWithFire&quot; (выбор в инсталляторе). Та же функция, с использованием этого пакета:<br /></p><div class="codebox"><pre><code>Функция ПрочитатьCSV_2(Папка, ИмяФайла, КолПолей)
    // Параметры:
    // &quot;Папка&quot; - путь к файлу без имени файла с завершающим слешем,
    // &quot;ИмяФайла&quot; - имя файла,
    // &quot;КолПолей&quot; - количество колонок (число).
    // Функция возвращает ТаблицуЗначений с данными файла.
    
    Текст = &quot;[&quot; + ИмяФайла + &quot;]
    |ColNameHeader=False
    |Format=Delimited(;)
    |TextDelimiter=none
    |CharacterSet=ANSI
    |&quot;;
    Для ы = 1 По КолПолей Цикл
        Текст = Текст + &quot;Col&quot; + ы + &quot;=Field&quot; + ы + &quot; Text&quot; + Символы.ПС;
    КонецЦикла;
    ТекстДок = Новый ТекстовыйДокумент;
    ТекстДок.УстановитьТекст(Текст);
    ТекстДок.Записать(Папка + &quot;Schema.ini&quot;);
    
    objRec = Новый COMОбъект(&quot;ADODB.Recordset&quot;);
    strQuery = &quot;SELECT * FROM [&quot; + ИмяФайла + &quot;]&quot;;
    strConn = &quot;Provider=Microsoft.Jet.OLEDB.4.0;Data Source=&quot; + Папка + &quot;;Extended Properties=&quot;&quot;text;&quot;&quot;&quot;;
    adOpenStatic = 3;
    adLockOptimistic = 3;
    adCmdText = 1;
    objRec.Open(strQuery, strConn, adOpenStatic, adLockOptimistic, adCmdText);
    
    ПодключитьВнешнююКомпоненту(&quot;GameWithFire.ADOUtils&quot;);
    ADOUtils = Новый(&quot;AddIn.ADOUtils&quot;);
    Возврат ADOUtils.ADORecordsetToValueTable(objRec);
КонецФункции</code></pre></div><p>Файл из предыдущего поста был помещён в ТаблицуЗначений на том же компьютере за чуть более минуты (т.е. на порядок быстрее).</p>]]></description>
			<author><![CDATA[null@example.com (The gray Cardinal)]]></author>
			<pubDate>Tue, 29 Mar 2011 09:56:17 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=47085#p47085</guid>
		</item>
		<item>
			<title><![CDATA[1Cv8: чтение больших текстовых файлов (csv)]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=47071#p47071</link>
			<description><![CDATA[<p>Сделано по этому принципу: <a href="http://forum.script-coding.com/viewtopic.php?id=1322">VBScript: работа с большими текстовыми файлами</a>.<br />Функция читает файл и возвращает ТаблицуЗначений с данными файла.<br /></p><div class="codebox"><pre><code>Функция ПрочитатьCSV(Папка, ИмяФайла, КолПолей)
    // Параметры:
    // &quot;Папка&quot; - путь к файлу без имени файла с завершающим слешем,
    // &quot;ИмяФайла&quot; - имя файла,
    // &quot;КолПолей&quot; - количество колонок (число).
    // Функция возвращает ТаблицуЗначений с данными файла.
    
    Текст = &quot;[&quot; + ИмяФайла + &quot;]
    |ColNameHeader=False
    |Format=Delimited(;)
    |TextDelimiter=none
    |CharacterSet=ANSI
    |&quot;;
    Для ы = 1 По КолПолей Цикл
        Текст = Текст + &quot;Col&quot; + ы + &quot;=Field&quot; + ы + &quot; Text&quot; + Символы.ПС;
    КонецЦикла;
    ТекстДок = Новый ТекстовыйДокумент;
    ТекстДок.УстановитьТекст(Текст);
    ТекстДок.Записать(Папка + &quot;Schema.ini&quot;);
    
    objRec = Новый COMОбъект(&quot;ADODB.Recordset&quot;);
    strQuery = &quot;SELECT * FROM [&quot; + ИмяФайла + &quot;]&quot;;
    strConn = &quot;Provider=Microsoft.Jet.OLEDB.4.0;Data Source=&quot; + Папка + &quot;;Extended Properties=&quot;&quot;text;&quot;&quot;&quot;;
    adOpenStatic = 3;
    adLockOptimistic = 3;
    adCmdText = 1;
    ТаблЗнач = Новый ТаблицаЗначений;
    Для ы = 1 По КолПолей Цикл
        ТаблЗнач.Колонки.Добавить();
    КонецЦикла;
    
    objRec.Open(strQuery, strConn, adOpenStatic, adLockOptimistic, adCmdText);
    КолСтрок = objRec.RecordCount;
    Ном = 1;
    Пока Не objRec.EOF Цикл
        Если Ном % 500 = 0 Тогда
            Состояние(ИмяФайла + &quot; &quot; + Ном + &quot; из &quot; + КолСтрок);
        КонецЕсли;
        НовСтр = ТаблЗнач.Добавить();
        Для i=0 По objRec.Fields.Count-1 Цикл
            НовСтр[i] = Строка(objRec.Fields(i).Value);
        КонецЦикла;
        objRec.MoveNext();
        Ном = Ном + 1;
    КонецЦикла;
    objRec.Close();
    Возврат ТаблЗнач;
КонецФункции</code></pre></div><p>Помещение прочитанных строк в ТаблицуЗначений сделано &quot;в лоб&quot; и достаточно хорошо пожирает память (как сделать лучше, пока не знаю). Сама выборка из файла работает очень быстро. Файл размером 46 МБ (31 поле, 350 тыс. строк) был помещён в ТаблицуЗначений за порядка 12 минут (WinXP SP3, Pentium(R) Dual-Core CPU E5300 2.60 ГГц, 988 Mб ОЗУ).</p>]]></description>
			<author><![CDATA[null@example.com (The gray Cardinal)]]></author>
			<pubDate>Tue, 29 Mar 2011 07:14:48 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=47071#p47071</guid>
		</item>
	</channel>
</rss>
