View previous topic :: View next topic |
Author |
Message |
Volniy

Joined: 15 Dec 2004 Posts: 585 Location: Местный
|
(Separately) Posted: Sat Jan 09, 2010 05:18 Post subject: |
|
|
Batya wrote: | А нафига вообще кавычки? Для конструкции %P%N TotalCommander сам при необходимости добавит кавычки. |
Может и перебор, хотя наверное когда-то было нужно, в старых версиях Тотала, я уж не помню. Но ведь оно работает, так к чему тут приколупываться-то?
Скрипт писан "на коленке", по-быстрому. Ибо вряд ли оно еще кому понадобится. Не судите строго (и несудимы, кстати, будете ) |
|
Back to top |
|
 |
Batya

Joined: 15 Dec 2004 Posts: 2226 Location: Москва, Россия
|
(Separately) Posted: Sat Jan 09, 2010 17:36 Post subject: |
|
|
Tol!k wrote: | Хуже. По той же причине: "TotalCommander сам при необходимости добавит кавычки."
Кавычки нужны только для "%P" и "%T" без связки с %N и %M |
Странно, а мне казалось, что Гислер сделал "умное" добавление кавычек только для конструкций вида %P%N и %T%M.
Volniy wrote: | Но ведь оно работает, так к чему тут приколупываться-то? |
Сорри, никого не хотел обидеть. Просто уточнял. _________________ Нет, я не сплю. Я просто медленно моргаю. |
|
Back to top |
|
 |
Tol!k

Joined: 01 Apr 2008 Posts: 1727 Location: Арзамас
|
(Separately) Posted: Sat Jan 09, 2010 18:53 Post subject: |
|
|
Гислер сделал "умное" добавление кавычек для %N, %M и %S. Как одиноких, так и в связках с %P и %T
Без кавычек остались только одиночные %P и %T, да ещё %O с %E |
|
Back to top |
|
 |
Tol!k

Joined: 01 Apr 2008 Posts: 1727 Location: Арзамас
|
(Separately) Posted: Sat Jan 09, 2010 23:39 Post subject: |
|
|
Avada
Эти двойные стандарты не упомянуты в справке, а ведь лишние и недостающие кавычки дают по-своему неожиданные результаты |
|
Back to top |
|
 |
Avada

Joined: 01 Aug 2008 Posts: 10419 Location: Россия, Саратов
|
(Separately) Posted: Sun Jan 10, 2010 00:17 Post subject: |
|
|
Tol!k
Да, в оригинальной справке отсутствует. А в русской справке это вряд ли возможно с исчерпывающей полнотой описать — не тот формат материала. В статье в TCKB — да, была бы уместно, если кто-то соберётся с силами сей предмет до конца исследовать. А мы можем только в книгу постараться добавить при подготовке гипотетического нового издания. _________________ Даже самая богатая фантазия
Не представит себе наши безобразия. |
|
Back to top |
|
 |
Вахмурка

Joined: 27 Dec 2004 Posts: 2586 Location: Большая деревня Москва
|
(Separately) Posted: Sun Jan 10, 2010 15:43 Post subject: |
|
|
Один из аспектов проблемы освещен в этой статье, хотя на "исчерпывающее" исследование она, конечно, не претендует. Неужели на английском форуме никто эту тему не поднимал? Предвосхищая вопрос: сам не видел, поиск затруднен ввиду отсутствия ярко выраженных ключевых слов. Поверхностный поиск дал вот этот пост Гислера. _________________ Сайт PowerPro+Total Commander
Скрипты PowerPro для Total Commander
* * *
«Не усматривайте злого умысла в том, что вполне объяснимо глупостью» (Р. Хэнлон) |
|
Back to top |
|
 |
JayK
Joined: 04 Mar 2008 Posts: 39
|
(Separately) Posted: Mon Jan 11, 2010 11:31 Post subject: |
|
|
А если разбиение не по одной строке, а по задаваемому кол-ву, можно такое сделать? |
|
Back to top |
|
 |
Вахмурка

Joined: 27 Dec 2004 Posts: 2586 Location: Большая деревня Москва
|
|
Back to top |
|
 |
Tol!k

Joined: 01 Apr 2008 Posts: 1727 Location: Арзамас
|
(Separately) Posted: Mon Jan 11, 2010 14:03 Post subject: |
|
|
Вахмурка
Вариант на чистом бат-е имеет неприятный недостаток. Не стоит плодить неполноценные решения |
|
Back to top |
|
 |
Вахмурка

Joined: 27 Dec 2004 Posts: 2586 Location: Большая деревня Москва
|
(Separately) Posted: Mon Jan 11, 2010 14:11 Post subject: |
|
|
2JayK
Если скрипт PowerPro устраивает, четко ставь задачу. Например: как задается число? Весь файл режется на куски из одинакового числа строк? А как быть с остатком? Как именовать результирующие файлы? Файл чисто текстовый, без управляющих символов? Пустые строки считать? И т. д. _________________ Сайт PowerPro+Total Commander
Скрипты PowerPro для Total Commander
* * *
«Не усматривайте злого умысла в том, что вполне объяснимо глупостью» (Р. Хэнлон) |
|
Back to top |
|
 |
Batya

Joined: 15 Dec 2004 Posts: 2226 Location: Москва, Россия
|
(Separately) Posted: Mon Jan 11, 2010 16:23 Post subject: |
|
|
JayK wrote: | А если разбиение не по одной строке, а по задаваемому кол-ву, можно такое сделать? |
Можно:
Code: | '=====================================================================
' Разрезание выделенных файлов на заданное количество строк
'
' Параметры:
' {файл-список} [{количество строк}]
'
' Пример вызова из TC:
' %L 2
'=====================================================================
Option Explicit
'======== Изменяемые параметры =======================================
Const DefRowCount = 1 'Количество строк по умолчанию
Const NameMode = 0 'Режим формирования имен файлов
'Варианты режима формирования имен:
' 0 - {Имя}.{Расширение}.{Номер части}
' 1 - {Имя}.{Номер части}.{Расширение}
' 2 - {Имя}_{Номер части}.{Расширение}
' 3 - {Имя}[{Номер части}].{Расширение}
'=====================================================================
Dim Mess, FSO, WSH, FF, RowCount
SetMess
Set FSO = CreateObject("Scripting.FileSystemObject")
Set WSH = CreateObject("WScript.Shell")
On Error Resume Next
CheckParam:CheckErr
Main:CheckErr
'MessBox Mess(3), 3
Quit 0
Sub Main
Dim F
For Each F In Split(FSO.OpenTextFile(FF).ReadAll, vbNewLine)
Action F
Next
End Sub
Sub Action(pPath)
Dim lText, lT, lCnt, lPath, lArr, lR, lNum, lNewPath
If pPath = "" Then Exit Sub
lPath = GetPath(pPath)
If Not FSO.FileExists(lPath) Then Exit Sub
lText = FSO.OpenTextFile(lPath).ReadAll
lCnt = 0
lArr = CutText(lText, RowCount)
lR = Len(CStr(UBound(lArr)))
For Each lT In lArr
lNum = Right(String(lR, "0") & CStr(lCnt), lR)
Select Case NameMode
Case 0 lNewPath = lPath & "." & lNum
Case 1 lNewPath = FSO.GetParentFolderName(lPath) & "\" & FSO.GetBaseName(lPath) &_
"." & lNum & "." & FSO.GetExtensionName(lPath)
Case 2 lNewPath = FSO.GetParentFolderName(lPath) & "\" & FSO.GetBaseName(lPath) &_
"_" & lNum & "." & FSO.GetExtensionName(lPath)
Case 3 lNewPath = FSO.GetParentFolderName(lPath) & "\" & FSO.GetBaseName(lPath) &_
"[" & lNum & "]." & FSO.GetExtensionName(lPath)
End Select
FSO.CreateTextFile(lNewPath, True).Write lT
lCnt = lCnt + 1
Next
End Sub
Function CutText(pText, pRowCount)
Dim lArr, lR, lR1, l, l1, l2, l3
lArr = Split(pText, vbNewLine)
lR = UBound(lArr)
lR1 = -Int(-(lR + 1)/pRowCount) - 1
ReDim lArr1(lR1)
For l = 0 To lR1
l1 = (l + 1) * pRowCount - 1
l2 = pRowCount - 1
If l1 > lR Then l2 = lR - l * pRowCount
For l3 = 0 To l2
lArr1(l) = lArr1(l) & lArr(l3 + l1 - pRowCount + 1) & vbNewLine
Next
Next
lArr1(lR1) = Left(lArr1(lR1), Len(lArr1(lR1)) - Len(vbNewLine))
CutText = lArr1
End Function
Sub CheckParam
With WScript
If .Arguments.Count = 0 Then Err.Raise vbObjectError + 1, "", Mess(1)
FF = GetPath(.Arguments(0))
If Not FSO.FileExists(FF) Then Err.Raise vbObjectError + 2, "", Mess(2)
If .Arguments.Count > 1 Then
RowCount = .Arguments(1)
If IsNumeric(RowCount) Then
RowCount = CInt(RowCount)
Else
RowCount = DefRowCount
End If
Else
RowCount = DefRowCount
End If
End With
End Sub
Function GetPath(pPath)
GetPath = FSO.GetAbsolutePathName(WSH.ExpandEnvironmentStrings(pPath))
End Function
Sub CheckErr
If Err.Number <> 0 Then
MessBox "Возникла ошибка № " & Err.Number & ":" & vbNewLine & Err.Description, 1
Quit Err.Number
End If
End Sub
Function MessBox(pMess, pMode)
Dim lIcon
Select Case pMode
Case 1 lIcon = vbCritical + vbOKOnly
Case 2 lIcon = vbExclamation + vbOKOnly
Case 3 lIcon = vbInformation + vbOKOnly
End Select
MessBox = MsgBox(pMess, lIcon, Mess(0))
End Function
Sub SetMess
Set Mess = CreateObject("Scripting.Dictionary")
With Mess
.Add 0, "Разрезание файлов на строки"
.Add 1, "Не указаны параметры!"
.Add 2, "Файл-список не существует!"
.Add 3, "Операция завершена."
End With
End Sub
Sub Quit(pQuitCode)
Set Mess = Nothing
Set WSH = Nothing
Set FSO = Nothing
WScript.Quit pQuitCode
End Sub |
Last edited by Batya on Thu Jan 14, 2010 15:48; edited 4 times in total |
|
Back to top |
|
 |
Volniy

Joined: 15 Dec 2004 Posts: 585 Location: Местный
|
(Separately) Posted: Tue Jan 12, 2010 16:50 Post subject: |
|
|
JayK wrote: | А если разбиение не по одной строке, а по задаваемому кол-ву, можно такое сделать? |
Можно (еще один "наколенный" скрипт ).
Исправленный вариант.
Code: | Dim fso, InFile, Cnt, Stroki, ts, nn
Set fso = CreateObject("Scripting.FileSystemObject")
InFile = WScript.Arguments(0)
Set ts=fso.OpenTextFile(InFile,1)
Const n=3 ' число строк в каждом "куске"
Cnt=0
Do Until ts.AtEndOfStream
Stroki=""
For nn = 1 To n
If Not ts.AtEndOfStream Then
Stroki=Stroki & ts.ReadLine & vbNewLine
End If
Next
Set MyFile= fso.CreateTextFile(InFile & "." & CStr(Cnt), True)
MyFile.Write(Stroki)
MyFile.Close
Cnt=Cnt+1
Loop
ts.Close
Set ts=Nothing
Set fso = Nothing
WScript.Quit
|
Last edited by Volniy on Wed Jan 13, 2010 18:45; edited 1 time in total |
|
Back to top |
|
 |
Batya

Joined: 15 Dec 2004 Posts: 2226 Location: Москва, Россия
|
(Separately) Posted: Wed Jan 13, 2010 10:22 Post subject: |
|
|
Volniy wrote: | Stroki=Stroki & ts.ReadLine & vbNewLine
...
myfile.Write(Stroki) |
Лишний перенос строки в конце каждого куска. Забыл добавить итоговую обрезку vbNewLine. _________________ Нет, я не сплю. Я просто медленно моргаю. |
|
Back to top |
|
 |
Volniy

Joined: 15 Dec 2004 Posts: 585 Location: Местный
|
(Separately) Posted: Wed Jan 13, 2010 11:31 Post subject: |
|
|
А ничего лишнего, в конце строки и должен стоять символ конца строки. В противном случае эта строка даже не прочтется функцией .ReadLine. При записи через .WriteLine последняя строка просто будет продолжена, а не добавлена новая, e.t.c.
Задание было: создать файл, состоящий из N строк. Оно выполнено. |
|
Back to top |
|
 |
Batya

Joined: 15 Dec 2004 Posts: 2226 Location: Москва, Россия
|
(Separately) Posted: Wed Jan 13, 2010 11:45 Post subject: |
|
|
Volniy
Ну, как хочешь.
Только, на мой взгляд, если разбиваем по 3 строки, то в итоговых файлах должно быть по 3 строки, а не 4, как сейчас.
Volniy wrote: | В противном случае эта строка даже не прочтется функцией .ReadLine. |
Ничего подобного - .ReadLine нормально отрабатывает на последней строке без замыкающего vbNewLine. _________________ Нет, я не сплю. Я просто медленно моргаю. |
|
Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|