<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[Серый форум &mdash; VBS: для объединения CSV файлов]]></title>
		<link>https://forum.script-coding.com/viewtopic.php?id=15477</link>
		<atom:link href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=15477&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «VBS: для объединения CSV файлов».]]></description>
		<lastBuildDate>Fri, 03 Jul 2020 09:57:42 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: VBS: для объединения CSV файлов]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=140531#p140531</link>
			<description><![CDATA[<p><strong>andypetr</strong><br />Ваш статус изменён, прошу <a href="http://forum.script-coding.com/rules.html#6.">ознакомиться</a>.<br /><span class="postimg"><img src="http://yoursmileys.ru/tsmile/forum/t1230.gif" alt="http://yoursmileys.ru/tsmile/forum/t1230.gif" /></span></p>]]></description>
			<author><![CDATA[null@example.com (JSmаn)]]></author>
			<pubDate>Fri, 03 Jul 2020 09:57:42 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=140531#p140531</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBS: для объединения CSV файлов]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=140303#p140303</link>
			<description><![CDATA[<p><strong>Rabi</strong>, добрый день.</p><p>Насколько я понял, есть несколько CSV, которые нужно объединять в один файл. </p><p>1) Т.е., заголовки (первая строка) должны браться только один раз из первого файла, из остальных добавляются данные, начиная со второй строки.<br />В именах файлов есть ещё время, его я решил игнорировать.</p><p>2) Исходные файлы берутся из папки MAG, после обработки переносятся в папку MAG_ARHIV (чтобы далее их не дублировать).<br />Хотя при этом результирующий файл я каждый раз переписываю...<br />Возможно, не до конца разобрался, что же всё-таки нужно.</p><p>Тестовые файлы (в папке MAG) - содержимое я взял произвольное:<br /></p><div class="codebox"><pre><code>
MAG8000_296305H319_2020-02-08 0403.csv:
	Дата;ФИО;Сумма
	08.02.2020;ИВАНОВ ИИ;1000
	08.02.2020;ПЕТРОВ ПП;2000

MAG8000_296305H319_2020-02-26 0701.csv:
	Дата;ФИО;Сумма
	26.02.2020;ИВАНОВ ИИ;111
	26.02.2020;СИДОРОВ СС;3000
</code></pre></div><p>Результат (в папке программы):<br /></p><div class="codebox"><pre><code>
MAG8000_296305H319.csv:
	Дата;ФИО;Сумма
	08.02.2020;ИВАНОВ ИИ;1000
	08.02.2020;ПЕТРОВ ПП;2000
	26.02.2020;ИВАНОВ ИИ;111
	26.02.2020;СИДОРОВ СС;3000
</code></pre></div><p>Код программы (вызывается с параметрами, например: csv_append.vbs MAG8000_296305H319 2020-02-01 2020-02-29)<br /></p><div class="codebox"><pre><code>
Option Explicit
On Error Resume Next

  Dim sHelpMsg : sHelpMsg = &quot;&quot; _
                 &amp; vbCrLf &amp; &quot;Параметры: Шаблон Дата_Нач Дата_Кон&quot; _
                 &amp; vbCrLf &amp; &quot;Результат: Шаблон.csv&quot; _
                 &amp; vbCrLf &amp; &quot;Пример:    MAG8000_296305H319 2020-02-01 2020-02-29&quot;
                 &#039;имена файлов формата: MAG8000_296305H319_2020-02-08 0403.csv

  Const s_FldCsv = &quot;MAG\&quot;
  Const s_FldArh = &quot;MAG_ARHIV\&quot;
  Const s_CsvExt = &quot;.csv&quot;

  Dim goShellApp : Set goShellApp = CreateObject(&quot;Shell.Application&quot;)
  Dim goWsShell  : Set goWsShell  = CreateObject(&quot;WScript.Shell&quot;)
  Dim goFSO      : Set goFSO      = CreateObject(&quot;Scripting.FileSystemObject&quot;)
  Dim goParams   : Set goParams   = WScript.Arguments.Unnamed
  Dim gsFldWork  : gsFldWork      = goFSO.GetParentFolderName(WScript.ScriptFullName) &amp; &quot;\&quot;

  Dim sTemplate, dStart, dEnd
  Dim sResult, sArhiv
  Dim sFile, oFile, sFld, sText, nTmp

  &#039; создание папок
  For Each sFld In Array(s_FldCsv, s_FldArh)
    goFSO.CreateFolder(sFld)
  Next &#039;sFld

  &#039; проверка на число параметров
  If goParams.Length &lt;&gt; 3 Then
    WScript.Echo sHelpMsg
    WScript.Quit(0)
  End If 

  &#039; разбор параметров
  sTemplate = goFSO.GetBaseName(Trim(goParams(0)))
  dStart    = Trim(goParams(1))
  dEnd      = Trim(goParams(2))

  sResult   = sTemplate &amp; s_CsvExt

  &#039; если файл результата существует - убираем его в архивную папку
  If goFSO.FileExists(sResult) Then
    sArhiv = goFSO.BuildPath(s_FldArh, goFSO.GetFileName(sResult))
    goFSO.DeleteFile sArhiv, True
    goFSO.MoveFile sResult, sArhiv
    If goFSO.FileExists(sResult) Then
      WScript.Echo &quot;Ошибка удаления старого файла: &quot; &amp; sResult
      WScript.Quit(0)
    End If
  End If

  &#039; обработка файлов в паке MAG\
  For Each oFile In goFSO.GetFolder(s_FldCsv).Files

    sFile = oFile.Path

    If StrComp(&quot;.&quot; &amp; goFSO.GetExtensionName(sFile), s_CsvExt, vbTextCompare) = 0 Then

      &#039; имена между MAG8000_296305H319_2020-02-01 0000.csv и MAG8000_296305H319_2020-02-29 9999.csv
      If StrComp(goFSO.GetBaseName(sFile), sTemplate &amp; &quot;_&quot; &amp; dStart &amp; &quot; 0000&quot; , vbTextCompare) &gt;= 0 and _ 
         StrComp(goFSO.GetBaseName(sFile), sTemplate &amp; &quot;_&quot; &amp; dEnd   &amp; &quot; 9999&quot; , vbTextCompare) &lt;= 0 Then

        sText = &quot;&quot;
        With goFSO.OpenTextFile(sFile, 1) &#039;ForReading
          sText = .ReadAll : .Close
        End With

        &#039; если этот CSV не первый - убираем заголовок
        If goFSO.FileExists(sResult) Then
          nTmp = InStr(1, sText, vbCrLf, vbTextCompare)
          If nTmp &lt;&gt; 0 Then sText = Mid(sText, nTmp + Len(vbCrLf))
          sText = vbCrLf &amp; sText
        End If

        &#039; убираем &quot;лишний&quot; возврат строки в конце
        If Right(sText, Len(vbCrLf)) = vbCrLf Then
          sText = Left(sText, Len(sText) - Len(vbCrLf))
        End If

        With goFSO.OpenTextFile(sResult, 8, True) &#039;Append, Create
          .Write(sText) : .Close
        End With

        &#039; убираем в архивную папку обработанный CSV
        &#039;  1=0 если не надо удалять CSV
        If 1=1 Then
          sArhiv = goFSO.BuildPath(s_FldArh, goFSO.GetFileName(sFile))
          goFSO.DeleteFile sArhiv, True
          goFSO.MoveFile sFile, sArhiv
          If goFSO.FileExists(sFile) Then
            WScript.Echo &quot;Ошибка удаления файла: &quot; &amp; sFile
            &#039;WScript.Quit(0)
          End If
        End If

      End If
    
    End If
  Next &#039;oFile

  If goFSO.FileExists(sResult) Then
    sText = &quot; создан файл: &quot; &amp; sResult
  Else
    sText = &quot; файлы не найдены, результат пустой.&quot;
  End If
  WScript.Echo &quot;По заданному периоду&quot;, dStart, &quot; .. &quot;, dEnd, sText

WScript.Quit(0)
</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (andypetr)]]></author>
			<pubDate>Thu, 25 Jun 2020 11:33:10 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=140303#p140303</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBS: для объединения CSV файлов]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=140301#p140301</link>
			<description><![CDATA[<p><strong>Rumata</strong> спасибо, у меня уже есть код который читает актуальные&nbsp; &quot;csv&quot; по дате изменения, я хотел дополнить его скриптом который после прочтения файла склеивает его с общим архивным файлом</p>]]></description>
			<author><![CDATA[null@example.com (Rabi)]]></author>
			<pubDate>Thu, 25 Jun 2020 10:12:31 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=140301#p140301</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBS: для объединения CSV файлов]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=140293#p140293</link>
			<description><![CDATA[<p>Можно вообще не привязываться к имени результирующего файла, а вывод направлять на консоль. Тогда (и это плюс!) вывод этого скрипта можно перенаправить на вход другого скрипта, обработчика CSV-файлов (о котором товарищ Rabi уже спрашивал)</p><div class="codebox"><pre><code>
@echo off

if &quot;%~1&quot; == &quot;&quot; (
	echo:Usage: %~n0 date
	goto :EOF
)

setlocal

set &quot;SRC_DATE=%~1&quot;
set &quot;SRC_TMPL=MAG8000_*_%SRC_DATE%&quot;

for /f &quot;tokens=*&quot; %%f in ( &#039;dir /b /s /a-d &quot;%SRC_TMPL%&quot;&#039; ) do type &quot;%%f&quot;
</code></pre></div><p>Примеры использования:<br />1<br /></p><div class="codebox"><pre><code>
этот-скрипт 2020-02-26 &gt; какой-то-один-файл
</code></pre></div><p>2<br /></p><div class="codebox"><pre><code>
этот-скрипт 2020-02-26 | тот-скрипт &gt; какой-то-другой-файл
</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (Rumata)]]></author>
			<pubDate>Thu, 25 Jun 2020 06:53:05 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=140293#p140293</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBS: для объединения CSV файлов]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=140292#p140292</link>
			<description><![CDATA[<div class="quotebox"><cite>wisgest пишет:</cite><blockquote><p>а почему</p></blockquote></div><p>Потому что не догадался о таком варианте. (-:</p><div class="quotebox"><cite>wisgest пишет:</cite><blockquote><p>Ну и</p></blockquote></div><p>Добавить проверку перед созданием файла и прекращать выполнение скрипта если файл существует и выставлен атрибут. Но я считаю, что это избыточно. Достаточно пересоздавать файл на заданную дату при каждом запуске скрипта. Что и делает предложенный скрипт (оригинальный мой или с улучшением товарища wisgest).</p>]]></description>
			<author><![CDATA[null@example.com (Rumata)]]></author>
			<pubDate>Thu, 25 Jun 2020 06:46:46 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=140292#p140292</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBS: для объединения CSV файлов]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=140290#p140290</link>
			<description><![CDATA[<p><strong>Rumata</strong>, а почему<br /></p><div class="codebox"><pre><code>type nul &gt; &quot;%DST_FILE%&quot;

for /f &quot;tokens=*&quot; %%f in ( &#039;dir /b /s /a-d &quot;%SRC_TMPL%&quot;&#039; ) do type &quot;%%f&quot; &gt;&gt; &quot;%DST_FILE%&quot;</code></pre></div><p>а не </p><div class="codebox"><pre><code>(for /f &quot;tokens=*&quot; %%f in ( &#039;dir /b /s /a-d &quot;%SRC_TMPL%&quot;&#039; ) do type &quot;%%f&quot;) &gt; &quot;%DST_FILE%&quot;</code></pre></div><p>— есть какие-то преимущества или просто дело вкуса?<br />Ну и </p><div class="quotebox"><cite>Rabi пишет:</cite><blockquote><p>При этом надо чтоб скрипт делал запись нового файла в архивный файл однократно, во избежания дублированных записей при каждом вызове скрипта.</p></blockquote></div><p>— вероятно, надо сбрасывать атрибут «Архивный» и не обрабатывать файлы без этого атрибута или как-то ещё.</p>]]></description>
			<author><![CDATA[null@example.com (wisgest)]]></author>
			<pubDate>Thu, 25 Jun 2020 05:28:42 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=140290#p140290</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBS: для объединения CSV файлов]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=140289#p140289</link>
			<description><![CDATA[<p>Можно. Но лучше это сделать через батник:<br /></p><div class="codebox"><pre><code>
@echo off

if &quot;%~1&quot; == &quot;&quot; (
	echo:Usage: %~n0 date
	goto :EOF
)

setlocal

set &quot;SRC_DATE=%~1&quot;
set &quot;SRC_TMPL=MAG8000_*_%SRC_DATE%&quot;
set &quot;DST_FILE=MAG8000_%SRC_DATE%.csv&quot;

type nul &gt; &quot;%DST_FILE%&quot;

for /f &quot;tokens=*&quot; %%f in ( &#039;dir /b /s /a-d &quot;%SRC_TMPL%&quot;&#039; ) do type &quot;%%f&quot; &gt;&gt; &quot;%DST_FILE%&quot;
</code></pre></div><p>Скрипт вызывается с обязательным параметром - дата (например, 2020-02-26). <br />Скрипт рекурсивно ищет в текущей директории все файлы согласно формату <strong>MAG8000_*_дата</strong> и собирает их все в файл по имени <strong>MAG8000_дата.csv</strong>.</p><p>Вас самому надо определить точно:<br />-- шаблон для поиска оригинальных файлов<br />-- имя для результирующего файла</p>]]></description>
			<author><![CDATA[null@example.com (Rumata)]]></author>
			<pubDate>Thu, 25 Jun 2020 04:51:15 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=140289#p140289</guid>
		</item>
		<item>
			<title><![CDATA[VBS: для объединения CSV файлов]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=140288#p140288</link>
			<description><![CDATA[<p>Здравствуйте! Столкнулся со следующей проблемой, у нас есть 108 расходомерных устройств которые регулярно отправляют отчет в виде &quot;CSV&quot; файлов с датами на хвосте (MAG8000_296305H319_2020-02-08 0403, MAG8000_296305H319_2020-02-26 0701).Для того чтоб каждый файл с определенной датой не открывать отдельно. Можно ли их объединять в один архивный CSV файл например: MAG8000_296305H319.csv где собраны записи за весь период. При этом надо чтоб скрипт делал запись нового файла в архивный файл однократно, во избежания дублированных записей при каждом вызове скрипта.</p>]]></description>
			<author><![CDATA[null@example.com (Rabi)]]></author>
			<pubDate>Thu, 25 Jun 2020 03:47:01 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=140288#p140288</guid>
		</item>
	</channel>
</rss>
