Total Commander Forum Index Total Commander
Форум поддержки пользователей Total Commander
Сайты: Все о Total Commander | Totalcmd.net | Ghisler.com | RU.TCKB
 
 RulesRules   SearchSearch   FAQFAQ   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Построчное разрезание TXT-файла
Goto page Previous  1, 2, 3, 4  Next
 
Post new topic   Reply to topic    Total Commander Forum Index -> Автоматизация Total Commander printer-friendly view
View previous topic :: View next topic  
Author Message
Volniy



Joined: 15 Dec 2004
Posts: 585
Location: Местный

Post (Separately) Posted: Sat Jan 09, 2010 05:18    Post subject: Reply with quote

Batya wrote:
А нафига вообще кавычки? Для конструкции %P%N TotalCommander сам при необходимости добавит кавычки.


Может и перебор, хотя наверное когда-то было нужно, в старых версиях Тотала, я уж не помню. Но ведь оно работает, так к чему тут приколупываться-то?

Скрипт писан "на коленке", по-быстрому. Ибо вряд ли оно еще кому понадобится. Не судите строго (и несудимы, кстати, будете Wink )
Back to top
View user's profile Send private message
Batya



Joined: 15 Dec 2004
Posts: 2226
Location: Москва, Россия

Post (Separately) Posted: Sat Jan 09, 2010 17:36    Post subject: Reply with quote

Tol!k wrote:
Хуже. По той же причине: "TotalCommander сам при необходимости добавит кавычки."
Кавычки нужны только для "%P" и "%T" без связки с %N и %M

Странно, а мне казалось, что Гислер сделал "умное" добавление кавычек только для конструкций вида %P%N и %T%M.

Volniy wrote:
Но ведь оно работает, так к чему тут приколупываться-то?

Сорри, никого не хотел обидеть. Просто уточнял.
_________________
Нет, я не сплю. Я просто медленно моргаю.
Back to top
View user's profile Send private message
Tol!k



Joined: 01 Apr 2008
Posts: 1727
Location: Арзамас

Post (Separately) Posted: Sat Jan 09, 2010 18:53    Post subject: Reply with quote

Гислер сделал "умное" добавление кавычек для %N, %M и %S. Как одиноких, так и в связках с %P и %T
Без кавычек остались только одиночные %P и %T, да ещё %O с %E
Back to top
View user's profile Send private message
Tol!k



Joined: 01 Apr 2008
Posts: 1727
Location: Арзамас

Post (Separately) Posted: Sat Jan 09, 2010 23:39    Post subject: Reply with quote

Avada
Эти двойные стандарты не упомянуты в справке, а ведь лишние и недостающие кавычки дают по-своему неожиданные результаты
Back to top
View user's profile Send private message
Avada



Joined: 01 Aug 2008
Posts: 10419
Location: Россия, Саратов

Post (Separately) Posted: Sun Jan 10, 2010 00:17    Post subject: Reply with quote

Tol!k
Да, в оригинальной справке отсутствует. А в русской справке это вряд ли возможно с исчерпывающей полнотой описать — не тот формат материала. В статье в TCKB — да, была бы уместно, если кто-то соберётся с силами сей предмет до конца исследовать. А мы можем только в книгу постараться добавить при подготовке гипотетического нового издания.
_________________
Даже самая богатая фантазия
Не представит себе наши безобразия.
Back to top
View user's profile Send private message
Вахмурка



Joined: 27 Dec 2004
Posts: 2586
Location: Большая деревня Москва

Post (Separately) Posted: Sun Jan 10, 2010 15:43    Post subject: Reply with quote

Один из аспектов проблемы освещен в этой статье, хотя на "исчерпывающее" исследование она, конечно, не претендует. Неужели на английском форуме никто эту тему не поднимал? Предвосхищая вопрос: сам не видел, поиск затруднен ввиду отсутствия ярко выраженных ключевых слов. Поверхностный поиск дал вот этот пост Гислера.
_________________
Сайт PowerPro+Total Commander
Скрипты PowerPro для Total Commander
* * *
«Не усматривайте злого умысла в том, что вполне объяснимо глупостью» (Р. Хэнлон)
Back to top
View user's profile Send private message
JayK



Joined: 04 Mar 2008
Posts: 39

Post (Separately) Posted: Mon Jan 11, 2010 11:31    Post subject: Reply with quote

А если разбиение не по одной строке, а по задаваемому кол-ву, можно такое сделать?
Back to top
View user's profile Send private message
Вахмурка



Joined: 27 Dec 2004
Posts: 2586
Location: Большая деревня Москва

Post (Separately) Posted: Mon Jan 11, 2010 13:17    Post subject: Reply with quote

Скриптом - без проблем. Батником - жди ответа Tol!k'a.
_________________
Сайт PowerPro+Total Commander
Скрипты PowerPro для Total Commander
* * *
«Не усматривайте злого умысла в том, что вполне объяснимо глупостью» (Р. Хэнлон)
Back to top
View user's profile Send private message
Tol!k



Joined: 01 Apr 2008
Posts: 1727
Location: Арзамас

Post (Separately) Posted: Mon Jan 11, 2010 14:03    Post subject: Reply with quote

Вахмурка
Вариант на чистом бат-е имеет неприятный недостаток. Не стоит плодить неполноценные решения
Back to top
View user's profile Send private message
Вахмурка



Joined: 27 Dec 2004
Posts: 2586
Location: Большая деревня Москва

Post (Separately) Posted: Mon Jan 11, 2010 14:11    Post subject: Reply with quote

2JayK
Если скрипт PowerPro устраивает, четко ставь задачу. Например: как задается число? Весь файл режется на куски из одинакового числа строк? А как быть с остатком? Как именовать результирующие файлы? Файл чисто текстовый, без управляющих символов? Пустые строки считать? И т. д.
_________________
Сайт PowerPro+Total Commander
Скрипты PowerPro для Total Commander
* * *
«Не усматривайте злого умысла в том, что вполне объяснимо глупостью» (Р. Хэнлон)
Back to top
View user's profile Send private message
Batya



Joined: 15 Dec 2004
Posts: 2226
Location: Москва, Россия

Post (Separately) Posted: Mon Jan 11, 2010 16:23    Post subject: Reply with quote

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
View user's profile Send private message
Volniy



Joined: 15 Dec 2004
Posts: 585
Location: Местный

Post (Separately) Posted: Tue Jan 12, 2010 16:50    Post subject: Reply with quote

JayK wrote:
А если разбиение не по одной строке, а по задаваемому кол-ву, можно такое сделать?


Можно (еще один "наколенный" скрипт Wink ).
Исправленный вариант.
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
View user's profile Send private message
Batya



Joined: 15 Dec 2004
Posts: 2226
Location: Москва, Россия

Post (Separately) Posted: Wed Jan 13, 2010 10:22    Post subject: Reply with quote

Volniy wrote:
Stroki=Stroki & ts.ReadLine & vbNewLine
...
myfile.Write(Stroki)

Лишний перенос строки в конце каждого куска. Забыл добавить итоговую обрезку vbNewLine.
_________________
Нет, я не сплю. Я просто медленно моргаю.
Back to top
View user's profile Send private message
Volniy



Joined: 15 Dec 2004
Posts: 585
Location: Местный

Post (Separately) Posted: Wed Jan 13, 2010 11:31    Post subject: Reply with quote

А ничего лишнего, в конце строки и должен стоять символ конца строки. В противном случае эта строка даже не прочтется функцией .ReadLine. При записи через .WriteLine последняя строка просто будет продолжена, а не добавлена новая, e.t.c.

Задание было: создать файл, состоящий из N строк. Оно выполнено.
Back to top
View user's profile Send private message
Batya



Joined: 15 Dec 2004
Posts: 2226
Location: Москва, Россия

Post (Separately) Posted: Wed Jan 13, 2010 11:45    Post subject: Reply with quote

Volniy
Ну, как хочешь.
Только, на мой взгляд, если разбиваем по 3 строки, то в итоговых файлах должно быть по 3 строки, а не 4, как сейчас.

Volniy wrote:
В противном случае эта строка даже не прочтется функцией .ReadLine.

Ничего подобного - .ReadLine нормально отрабатывает на последней строке без замыкающего vbNewLine.
_________________
Нет, я не сплю. Я просто медленно моргаю.
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic    Total Commander Forum Index -> Автоматизация Total Commander All times are GMT + 4 Hours
Goto page Previous  1, 2, 3, 4  Next
Page 2 of 4

 
Jump to:  
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