Войти

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


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

YuS_2
27-01-2019, 15:13
простая замена подстрок »
А что будет простой заменой? И есть ли необходимость в ней?
К тому же, шаблон регулярки, вполне себе, может быть полным, простым текстом - чего не хватает в этом методе?

Busla
27-01-2019, 15:53
шаблон регулярки, вполне себе, может быть полным, простым текстом - чего не хватает в этом методе? »
а может быть и не простым текстом ;-)
когда текст - переменный, а шаблон - захардкоженная константа - всё ok
а когда найти нужно произвольную подстроку - пользователь ввёл, или в одном файле нужно найти строки из другого - случается жопа. Т.к. нужно изобретать способ экранирования синтаксиса регулярных выражений.

megaloman
27-01-2019, 20:17
YuS_2, Шаблон регулярки для замены подстроки, в общем случае, в JS, имхо сложноватый. В VBS реплэйс организован проще. BoxIn = "Z:\Soft_In"
FileIn = "^.*\.txt$" ' *.txt
BoxOut = "Z:\Soft_Out"
BoxArc = "Z:\Soft_In\Arc"
ExtOut = "csv"
Str1 = ":"
Str2 = ";"

Set RegMaska = CreateObject("VBScript.RegExp")
RegMaska.Pattern = FileIn
RegMaska.IgnoreCase = True

With CreateObject("Scripting.FileSystemObject")
On Error Resume Next
Set Folds = .GetFolder(BoxIn)
If Err.Number <> 0 Then
MsgBox "Ошибка при открытии папки" + vbCrLf + BoxIn + vbCrLf + vbCrLf + Err.Description
WScript.Quit 2
End If
On Error GoTo 0

Set Files = Folds.Files

For Each jf In Files
If RegMaska.Test(jf) Then
On Error Resume Next
Set fIn = .OpenTextFile(jf, 1, False)

If Err.Number <> 0 Then
MsgBox "Ошибка при открытии файла" + vbCrLf + .GetAbsolutePathName(jf) + vbCrLf + vbCrLf + Err.Description
WScript.Quit 2
End If
On Error GoTo 0

Alls = fIn.ReadAll
fIn.Close

NewName = BoxOut + "\" + .GetBaseName(jf) + "." + ExtOut
ArcName = BoxArc + "\" + .GetFileName(jf)

On Error Resume Next
Set fIn = .CreateTextFile(NewName, True)

If Err.Number <> 0 Then
MsgBox "Ошибка при создании файла" + vbCrLf + BoxOut + "\" + .GetBaseName(jf) + "." + ExtOut + vbCrLf + vbCrLf + Err.Description
WScript.Quit 2
End If
On Error GoTo 0

fIn.Write Replace(Alls, Str1, Str2)
fIn.Close
If .FileExists(ArcName) Then fIn=.DeleteFile(ArcName,True)
fIn = .MoveFile(.GetAbsolutePathName(jf), ArcName)
End If
Next
End With
' MsgBox "Скрипт завершен"

YuS_2
28-01-2019, 11:58
а может быть и не простым текстом ;-) »
не могу не согласиться ;-)
Т.к. нужно изобретать способ экранирования синтаксиса регулярных выражений. »
А, вот про что речь.... т.е. если шаблон вводится ручками или берется из неизвестного заранее текста? Это да, есть такой момент... но тут уж вряд ли что-либо изменится, ибо язык останется статичным навечно, скорее всего.

Шаблон регулярки для замены подстроки, в общем случае, в JS, имхо сложноватый. В VBS реплэйс организован проще. »
В общем случае, всё может считаться сложным... а вообще, сложность - понятие относительное, имхо. Тут бы пример какой-нибудь, был бы гораздо нагляднее...

ЗЫ да и я ведь не говорю ничего против того, что устаревают эти инструменты (wsh), потому и powershell пришел на замену всей этой связки. Но, увы, во всех абсолютно случаях полная замена пока невозможна и по большей части, именно из-за политики микрософт. Ведь даже в самом powershell есть много нюансов, привязанных даже не к версии PoSh, а к версии ОС, причем даже в пределах одной линейки номера этой ОС. Это вызывает удивление/раздражение и прочие отрицательные чувства, что естественно... А вот бороться с этим можно только кардинальным образом, то бишь сменой windows на что-то более другое. :)

DJ Mogarych
29-01-2019, 11:29
Powershell:

import-csv .\190124.txt -Delimiter ":" | export-csv .\190124.csv -Delimiter ";"


в самом powershell есть много нюансов, привязанных даже не к версии PoSh, а к версии ОС, причем даже в пределах одной линейки номера этой ОС »
Например?

YuS_2
29-01-2019, 12:54
Например? »
Например, выполните команду get-disk в PoSh v5.1 под Win7 и под Win 10, сравните результат.
Да и вообще, сравнить можно результаты команды get-command...

Iska
29-01-2019, 14:16
Powershell: »
Фокус не удастся :):
import-csv : The member "4" is already present.
At line:1 char:1
+ import-csv 'C:\Мои проекты\0240\0002.csv' -Delimiter ":" | export-csv ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [Import-Csv], ExtendedTypeSystemException
+ FullyQualifiedErrorId : AlreadyPresentPSMemberInfoInternalCollectionAdd,Microsoft.PowerShell.Commands.ImportCsvCommand
Например? »
Один и тот же код в одной и той же версии PowerShell 2.0 с одними и теми же входными данными возвращал разные результаты под разными ОС (Windows XP и Windows 7).

DJ Mogarych
31-01-2019, 11:08
Фокус не удастся »
Я взял нормальный CSV в текстовом формате. Если формат кривой, то ничего и не выйдет, это понятно.
разные результаты под разными ОС (Windows XP и Windows 7). »
То, что на старые операционки не ставится новый Powershell, понятно. Мне непонятен пассаж пропричем даже в пределах одной линейки номера этой ОС »

Busla
31-01-2019, 12:46
DJ Mogarych, формат не кривой. Iska туда засунул csv без заголовков, буквально тот, что в примере топикстартера.

YuS_2
31-01-2019, 15:07
непонятен пассаж про »
А что тут непонятного? Windows 10 во всех её вариациях... если, например, скрипт работать должен с магазином, а магазин этот физически отсутствует, что получим в итоге? Ну и т.п.

на старые операционки не ставится новый Powershell»
на windows 7, вполне себе, устанавливается v5.1 ...
к тому же, речь ведь была о:
Один и тот же код в одной и той же версии PowerShell 2.0 с одними и теми же входными данными возвращал разные результаты под разными ОС »

Iska туда засунул csv без заголовков »
А в csv обязан быть заголовок?
RFC - 4180
Допускается строка заголовка в первой строке в том же формате, что и обычная строка
записи. Этот заголовок будет содержать имена, соответствующие полям в файле и должен
содержать то же количество полей, что и записи в остальной части файла (наличие или
отсутствие строки заголовка должно быть указано с помощью дополнительного параметра
"header" ("заголовок")

если требуется powershell, просто надо определить свои заголовки:
import-csv 1.txt -enc utf8 -head p1,p2,p3,p4,p5 -del ':'|export-csv 1.csv -enc utf8 -del ',' -not

Iska
31-01-2019, 19:02
Я взял нормальный CSV в текстовом формате. Если формат кривой, то ничего и не выйдет, это понятно. »
А кто сказал, что это CSV?!

То, что на старые операционки не ставится новый Powershell, понятно. »
Повторяю — речь шла про одну и ту же версию PowerShell. Конкретно, вторую.

если требуется powershell, просто надо определить свои заголовки: »
YuS_2, вот-вот. Я лично надеялся увидеть у командлета просто какой-нибудь параметр -NoHeading. Но увы.




© OSzone.net 2001-2012