Войти

Показать полную графическую версию : txt в csv


Страниц : [1] 2

porokh
25-01-2019, 15:39
Здравствуйте!
Есть текстовый файл 190124.txt (имя постоянно будет меняться) содержания 5:4:7:8:4: (будет меняться)
Нужно на выходе получить содержимое файла 5;4;7;8;4; файл должен быть csv (190124.csv)
Как это проще всего реализовать?

Elven
25-01-2019, 17:09
т.е. нужно в файле заменить все ":" на ";" и поменять расширение?

porokh
25-01-2019, 17:24
именно так

Elven
25-01-2019, 18:26
Для такого я обычно использую блокнот. А если файлов много и их лень открывать - Notepad++ (https://notepad-plus-plus.org/). Ну а переименование файлов это и вовсе банальная штука (мне, конечно, больше нравится TC, но тут уж, конечно на вкус и цвет).

porokh
25-01-2019, 19:29
Это и делается вручную в блокноте. А надо через планировщик автоматически.

Iska
25-01-2019, 19:44
porokh, на WSH:
Option Explicit

Dim strSourceFile

Dim objFSO
Dim strContent


If WScript.Arguments.Count = 1 Then
strSourceFile = WScript.Arguments.Item(0)

Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")

If objFSO.FileExists(strSourceFile) Then
With objFSO.OpenTextFile(strSourceFile)
strContent = .ReadAll()
.Close
End With

With objFSO.CreateTextFile(objFSO.GetBaseName(strSourceFile) & ".csv", True)
.Write Replace(strContent, ":", ";")
.Close
End With
Else
WScript.Echo "Can't find source file [" & strSourceFile & "]."
WScript.Quit 2
End If

Set objFSO = Nothing
Else
WScript.Echo "Usage: cscript.exe //nologo """ & WScript.ScriptName & """ <Source file>"
WScript.Quit 1
End If

WScript.Quit 0

Путь к исходному файлу указывается аргументом скрипта (также можно просто перетащить исходный файл на скрипт/ярлык на скрипт в Проводнике). Существующий csv-файл, одноимённый исходному, будет молча перезаписан.

P.S. Если размер Вашего исходного файла составляет более четверти размера физической оперативной памяти — пишите, сменим алгоритм на более щадяший к расходам оперативной памяти.

sov44
25-01-2019, 20:03
По простому, не усложняя
setlocal enabledelayedexpansion

set in=in.txt
set out=out.csv

for /f "delims=" %%n in (%in%) do (
set line=%%n
set line=!line::=;!
@echo !line!>>%out%
)
endlocal

Iska
25-01-2019, 20:21
sov44, вывод лучше вынести за пределы цикла разбора — намного быстрее будет. И промежуточное присваивание можно убрать. Наподобие:

>"%out%"" (
for /f "delims=" %%n in (%in%) do (
set line=%%n
@echo !line::=;!
)
)

porokh
25-01-2019, 20:54
Всем спасибо за помощь!!!

megaloman
25-01-2019, 21:42
porokh, @Echo Off
Set "File=Z:\Soft_In\*.txt"
Set "BoxOut=Z:\Soft_Out"
Set "BoxArc=Z:\Soft_In\Arc"
Set "ExtOut=csv"
Set "Sym1=:"
Set "Sym2=;"

If Not Exist "%BoxArc%" Md "%BoxArc%"

FOR %%f IN ("%File%") DO (
>"%BoxOut%\%%~nf.%ExtOut%" (FOR /F "usebackq delims=" %%s IN (`2^>nul more "%%f"`) DO (
Set "SS=%%s"
Call Echo %%SS:%Sym1%=%Sym2%%%
))
>nul Move /Y "%%f" "%BoxArc%\"
)
Во входной папке обрабатываются файлы по маске, заменяются указанные символы, файлы сохраняются в указанной выходной папке по заданному расширению, исходные файлы перемещаются в архив, чтобы больше их не обрабатывать при последующем запуске батника, так как Вам надочерез планировщик автоматически. »
ИМХО, Вы изложили только часть задачи. Что дальше происходит с CSV-файлами?

alpap
25-01-2019, 22:15
содержания 5:4:7:8:4: »
я правильно понимаю что в файле источнике единственная строка?

@echo off
set "maska=1*"

for %%a in ("%maska%.txt") do <"%%~a">"%%~na.csv" (set /p s=& call echo %%s::=;%%)
pause

porokh
26-01-2019, 00:55
Кол-во строк меняется.
Файл технический, данные потом оператор расшифровывает.

alpap
26-01-2019, 03:38
Кол-во строк меняется »
?
csv это зачастую однострочник, нигде в кодах выше не собирали строки в одну и вы не жаловались, поэтому и предположил что строка одна.

Busla
26-01-2019, 12:41
csv это зачастую однострочник »
это вырожденный случай
возможно, характерный для какой-то конкретной специфичной области

Как это проще всего реализовать? »
если в реальности во входном файле не цифры, а более произвольное содержание - отказаться от использования cmd/bat:
либо найти готовую утилиту, либо перейти на powershell
штатными средствами это решается и на vbs, но переходить на него сейчас - полный бесперспективняк, а в jscript не реализована простая замена текста

Iska
26-01-2019, 15:19
нигде в кодах выше не собирали строки в одну »
Но и не разбирали ;).

alpap
26-01-2019, 20:42
Но и не разбирали »
не понял. Ну да, там строки просто не трогали (за исключением внутренних изменений), а выше я написал что представлял себе csv как однострочник и мой код выше правильно будет работать с файлом из одной строки, вернее заберет из файла только первую строку, изменит ее и поместит в новый, остальные строки не тронет, что будет уже неправильно с учетом дополнения Busla
это вырожденный случай »
насколько я понял ТС в теме и я не стал зацикливаться на этом.

megaloman
26-01-2019, 21:25
alpap, решение элегантнейшее, хоть и не подходит клиенту

YuS_2
26-01-2019, 21:57
в jscript не реализована простая замена текста »
что значит простая замена?
В смысле это:
stringObj.replace(rgExp, replaceText)
?

Iska
26-01-2019, 23:01
не понял. »
porokh, на WSH:

With objFSO.OpenTextFile(strSourceFile)
strContent = .ReadAll()
.Close
End With

With objFSO.CreateTextFile(objFSO.GetBaseName(strSourceFile) & ".csv", True)
.Write Replace(strContent, ":", ";")
.Close
End With
…»
— левые кадеты, правые кадеты, какая к чёрту разница, если у тебя есть ружьё одна строка или несколько строк — неважно, читаем-пишем всё зараз.

штатными средствами это решается и на vbs, но переходить на него сейчас - полный бесперспективняк »
«А я сынок, всё одну, всё одну»™. Вы пишете, как будто это что-то плохое.

Busla
27-01-2019, 14:28
YuS_2, по-моему, очевидно, что regexp - это не простая замена подстрок




© OSzone.net 2001-2012