Страница 2 из 4
Добавлено: Сб янв 09, 2010 04:18
Volniy
Batya писал(а):А нафига вообще кавычки? Для конструкции %P%N TotalCommander сам при необходимости добавит кавычки.
Может и перебор, хотя наверное когда-то было нужно, в старых версиях Тотала, я уж не помню. Но ведь оно работает, так к чему тут приколупываться-то?
Скрипт писан "на коленке", по-быстрому. Ибо вряд ли оно еще кому понадобится. Не судите строго (и несудимы, кстати, будете

)
Добавлено: Сб янв 09, 2010 16:36
Batya
Tol!k писал(а):Хуже. По той же причине: "TotalCommander сам при необходимости добавит кавычки."
Кавычки нужны только для "%P" и "%T" без связки с %N и %M
Странно, а мне казалось, что Гислер сделал "умное" добавление кавычек только для конструкций вида %P%N и %T%M.
Volniy писал(а):Но ведь оно работает, так к чему тут приколупываться-то?
Сорри, никого не хотел обидеть. Просто уточнял.
Добавлено: Сб янв 09, 2010 17:53
Tol!k
Гислер сделал "умное" добавление кавычек для %N, %M и %S. Как одиноких, так и в связках с %P и %T
Без кавычек остались только одиночные %P и %T, да ещё %O с %E
Добавлено: Сб янв 09, 2010 22:39
Tol!k
Avada
Эти двойные стандарты не упомянуты в справке, а ведь лишние и недостающие кавычки дают по-своему неожиданные результаты
Добавлено: Сб янв 09, 2010 23:17
Avada
Tol!k
Да, в оригинальной справке отсутствует. А в русской справке это вряд ли возможно с исчерпывающей полнотой описать — не тот формат материала. В статье в TCKB — да, была бы уместно, если кто-то соберётся с силами сей предмет до конца исследовать. А мы можем только в книгу постараться добавить при подготовке гипотетического нового издания.
Добавлено: Вс янв 10, 2010 14:43
Вахмурка
Один из аспектов проблемы освещен в
этой статье, хотя на "исчерпывающее" исследование она, конечно, не претендует. Неужели на английском форуме никто эту тему не поднимал? Предвосхищая вопрос: сам не видел, поиск затруднен ввиду отсутствия ярко выраженных ключевых слов. Поверхностный поиск дал
вот этот пост Гислера.
Добавлено: Пн янв 11, 2010 10:31
JayK
А если разбиение не по одной строке, а по задаваемому кол-ву, можно такое сделать?
Добавлено: Пн янв 11, 2010 12:17
Вахмурка
Скриптом - без проблем. Батником - жди ответа Tol!k'a.
Добавлено: Пн янв 11, 2010 13:03
Tol!k
Вахмурка
Вариант на чистом бат-е имеет неприятный недостаток. Не стоит плодить неполноценные решения
Добавлено: Пн янв 11, 2010 13:11
Вахмурка
2JayK
Если скрипт PowerPro устраивает, четко ставь задачу. Например: как задается число? Весь файл режется на куски из одинакового числа строк? А как быть с остатком? Как именовать результирующие файлы? Файл чисто текстовый, без управляющих символов? Пустые строки считать? И т. д.
Добавлено: Пн янв 11, 2010 15:23
Batya
JayK писал(а):А если разбиение не по одной строке, а по задаваемому кол-ву, можно такое сделать?
Можно:
Код: Выделить всё
'=====================================================================
' Разрезание выделенных файлов на заданное количество строк
'
' Параметры:
' {файл-список} [{количество строк}]
'
' Пример вызова из 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
Добавлено: Вт янв 12, 2010 15:50
Volniy
JayK писал(а):А если разбиение не по одной строке, а по задаваемому кол-ву, можно такое сделать?
Можно (еще один "наколенный" скрипт

).
Исправленный вариант.
Код: Выделить всё
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
Добавлено: Ср янв 13, 2010 09:22
Batya
Volniy писал(а):Stroki=Stroki & ts.ReadLine & vbNewLine
...
myfile.Write(Stroki)
Лишний перенос строки в конце каждого куска. Забыл добавить итоговую обрезку vbNewLine.
Добавлено: Ср янв 13, 2010 10:31
Volniy
А ничего лишнего, в конце строки и должен стоять символ конца строки. В противном случае эта строка даже не прочтется функцией .ReadLine. При записи через .WriteLine последняя строка просто будет продолжена, а не добавлена новая, e.t.c.
Задание было: создать файл, состоящий из N строк. Оно выполнено.
Добавлено: Ср янв 13, 2010 10:45
Batya
Volniy
Ну, как хочешь.
Только, на мой взгляд, если разбиваем по 3 строки, то в итоговых файлах должно быть по 3 строки, а не 4, как сейчас.
Volniy писал(а):В противном случае эта строка даже не прочтется функцией .ReadLine.
Ничего подобного - .ReadLine нормально отрабатывает на последней строке без замыкающего vbNewLine.