Страница 2 из 4

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

Скрипт писан "на коленке", по-быстрому. Ибо вряд ли оно еще кому понадобится. Не судите строго (и несудимы, кстати, будете :wink: )

Добавлено: Сб янв 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 писал(а):А если разбиение не по одной строке, а по задаваемому кол-ву, можно такое сделать?
Можно (еще один "наколенный" скрипт :wink: ).
Исправленный вариант.

Код: Выделить всё

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.