<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Серый форум &mdash; 1Cv8: чтение больших текстовых файлов (csv)]]></title>
	<link rel="self" href="http://forum.script-coding.com/extern.php?action=feed&amp;tid=5664&amp;type=atom" />
	<updated>2011-03-29T09:56:17Z</updated>
	<generator>PunBB</generator>
	<id>http://forum.script-coding.com/viewtopic.php?id=5664</id>
		<entry>
			<title type="html"><![CDATA[Re: 1Cv8: чтение больших текстовых файлов (csv)]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=47085#p47085" />
			<content type="html"><![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>]]></content>
			<author>
				<name><![CDATA[The gray Cardinal]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=2</uri>
			</author>
			<updated>2011-03-29T09:56:17Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=47085#p47085</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[1Cv8: чтение больших текстовых файлов (csv)]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=47071#p47071" />
			<content type="html"><![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>]]></content>
			<author>
				<name><![CDATA[The gray Cardinal]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=2</uri>
			</author>
			<updated>2011-03-29T07:14:48Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=47071#p47071</id>
		</entry>
</feed>
