очень нужна помощь с кодировкой файла

Автор Atlant_50, 27 января 2020, 17:45

0 Пользователи и 1 гость просматривают эту тему.

Atlant_50

Всем доброго времени суток!

Есть файл 08101151.txt и много подобных ему в папке, допустим, d:\test. Данные файлы имеют кодировку utf-8.
Есть макрос, пусть очень кривой, но он есть (пока только учусь) , который обрабатывает эти файлики и вытаскивает нужную информацию в ячейки!
Но!!! вытаскивает он эту информацию в кривой кодировке! А нужно в кодировке windows-1251!  :( :( ??? ??? :'( :'(
Очень прошу помощи с кодировкой, чтобы строки в файлах читались уже в нужной кодировке.
Прошу помочь написать это в уже имеющемся макросе  (если можно с расшифровкой для тупеньких), без всяких батников для перекодирования!

И еще прошу помочь с границами для таблицы, что получится при выполнении макроса, там просто неизвестно какая строка будет последней.

 

rami

Цитата: Atlant_50 от 27 января 2020, 17:45Есть файл 08101151.txt и много подобных ему в папке, допустим, d:\test. Данные файлы имеют кодировку utf-8.
Кодировка файла: DOS/OS2-866/русский, а не utf-8.

Файл kod.txt у меня не скачивается. Выложите файл в формате ODS с макросом внутри.

bigor

У меня kod.txt скачался, но для вашего варианта макроса, когда вы читаете текстовые файлы построчно и обрабатываете построчно содержимое, могу предложить только поискать функцию конвертирования из  DOS/OS2-866/русский в utf-8. Хотя ей нужно будет обрабатывать каждую строку.
Эти файлы они стандартизированы? Т.е. если их открыть в calc, можно ли будет обрабатывать по адресам ячеек?

Перевыкладываю kod.txt и 08101151.txt загруженный в calc
Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут

Rafik

Цитата: Bigor от 27 января 2020, 19:29могу предложить только поискать функцию конвертирования из  DOS/OS2-866/русский в utf-8
Есть вариант перекодировки через режим csv. Точно не знаю можно ли задать загрузку текстового файла в режиме csv c разделителем "|" и кодировкой cp866 через макрос. Загрузка вручную с такими параметрами проходит нормально. Мне думается, вопрос с кодировкой будет решён, останется только вопрос с выуживанием нужных данных.

mikekaganski

#4
Цитата: Rafik от 29 января 2020, 07:17Точно не знаю можно ли задать загрузку текстового файла в режиме csv c разделителем "|" и кодировкой cp866 через макрос


Sub importCSV(sURL$)
dim args(1) as new com.sun.star.beans.PropertyValue
args(0).Name = "FilterName"
args(0).Value = "Text - txt - csv (StarCalc)"
args(1).Name = "FilterOptions"
args(1).Value = "124,34,30,1,,1049,,true," ' можно поставить 2 вместо 1, чтобы пропустить первую строку
StarDesktop.loadComponentFromURL(sURL, "_blank", 0, args())
End Sub

Sub testImportCSV
importCSV(ConvertToURL("D:\Downloads\08101151.txt"))
End Sub

Опции фильтра CSV.

Цитата: Bigor от 27 января 2020, 19:29поискать функцию конвертирования из  DOS/OS2-866/русский в utf-8


DefObj o
Sub readCP866(sURL$)
Dim oUcb, oInputStream, sInputLine$
oUcb = CreateUnoService("com.sun.star.ucb.SimpleFileAccess")
oInputStream = CreateUnoService("com.sun.star.io.TextInputStream")
oInputStream.setInputStream(oUcb.openFileRead(sURL$))
oInputStream.setEncoding("cp866")
Do While Not oInputStream.isEOF()
sInputLine = oInputStream.readLine()
MsgBox(sInputLine) ' здесь что-то делается с полученной строкой
Loop
oInputStream.closeInput()
End Sub

Sub testReadCP866
readCP866(ConvertToURL("D:\Downloads\08101151.txt"))
End Sub

com.sun.star.ucb.SimpleFileAccess.
com.sun.star.io.TextInputStream.
С уважением,
Михаил Каганский

economist

Atlant_50 - полагаю, что загрузить в Calc макросом один файл 08101151.txt в cp866 в Calc - это только малая часть общей задачи. Озвучьте её. Почему файлов много, каков загружаемый размер, как меняются их имена, нужно ли пересохранять их с другими значениями? Нужно ли "парсить" строки (извлекать нужные части)?

Саму загрузку в Calc можно автоматизировать и без макросов. Вот два варианта:

1) слить все TXT в один файл или переименовать 08101151.txt в import.txt и далее Лист - Вставить лист из файла - Связь. Однажды созданная связь будет автообновляться при открытии ODS файла автоматически, скорость - быстрее чем макросом.

2) использовать базу данных (ODB), которая автоматом отображает все текстовые файлы в папке как таблицы. С ними очень удобно работать с помощью языка SQL (есть "конструкторы" отборов, т.е. знать SQL не обязательно). Тут 4 под-варианта:
- адаптер Base к папке с TXT. Только чтение. Кодировка задается не в мастере, а уже после получения доступа
- драйвер ISAM от Microsoft, слинкованный с TXT или папкой, только чтение. На Windows считается "классикой"
- HSQLDB, слинкованный с TXT или папкой. За вычетом странностей HSQLB и мутной документации - быстро, годно, есть запись в TXT, если создать первичные ключи для строк.
- файл mdb/accdb (это MS Access), слинкованный с TXT или папкой, создать MDB можно неск. беспл. утилитами типа MSAQuery.exe (или в Windows есть компонент MDAC который это делает, искать макросы у Excel-истов). Есть запись (первичные ключи создаются автоматом).

Вот зря вы отказываетесь от BAT-ников. Какой-нить консольный iconv.exe решит задачу перекодирования влет. Прямое решение макросом - тоже может использовать его.  
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

mikekaganski

Цитата: Atlant_50 от 27 января 2020, 17:45Очень прошу помощи с кодировкой, чтобы строки в файлах читались уже в нужной кодировке.
Прошу помочь написать это в уже имеющемся макросе

Вот, прямо без всяких правок стиля:


sub BUH_PO_ORG_32_ORG
Dim oDoc as Object
Dim oSheet
Dim oCellRange ' диапазон
Dim oDataArray ' массив данных
Dim oCell
Dim f, l As String
f=1
l=9999999

Dim OVZR(100), kolf,  z, my_fop(100)
Dim maskbk(10000),massum(10000), masorg(10000)


Dim mastemp(1000),massum2(1000),massum3(1000), massum4(1000)
Dim massum5(1000), massum6(1000), massum7(1000), massum8(1000)
Dim massum9(1000), massum10(1000),massum11(1000), massum12(1000)
Dim massum13(1000), masnump(1000),massum1(1000), mastip(1000), masvid(1000)
Dim PathIn As String
Dim InFileName As String
Dim CurCol, CurRow, colkbk As Integer
Dim WordNumP, WordORG, WordNach, WordTip, WordSum, WordReshenie, WordResult, WordNumB As String 
Dim sNumP, sOrg, sTip, sResult, sNumb, sReshenie, sNach As String
dim sSum as Double
dim k,d,s,kolop


Dim sFile as String, sPath As String
Dim sDir as String, sValue as String
Dim iFIle, i,t, ikbk ,j as Double
Dim temp As Double

WordNumP = "ОРГАНИЗАЦИЯ" 'длЯ номера в 1с
WordORG = "ОРГАНИЗАЦИЯ" 'банк или почта
WordNach  = "НАЧИСЛЕНИЕ"
WordTip  = "НАЧИСЛЕНИЕ"
WordSum  = "<ОбщаяСуммаПоМассиву"


oDoc=ThisComponent
oSheet =oDoc.Sheets.getByName("32_ОРГ")
oCell=oSheet.getCellByposition(2,0) 
PathIn = oCell.getString()

sPath = "D:\666\test\1\"
PathIn= sPath

sValue = Dir$(sPath)
InFileName = sValue

iFile = 0
colkbk = 0
sValue = Dir$(sPath, 0)
Do
    If sValue <> "." and sValue <> ".." Then
        REM здесь файлы - описи
        If (inStr(sValue,"POSD") >= 0) Then
        iFile = iFile + 1
        my_fop(iFile-1) = sValue
    End if     
    End If
    sValue = Dir$
Loop Until sValue = ""

kolop=0
ikbk=0
Do while kolop < iFile
    InFileName = PathIn + my_fop(kolop)
a=1


Dim oUcb As Object, oInputStream As Object
oUcb = CreateUnoService("com.sun.star.ucb.SimpleFileAccess")
oInputStream = CreateUnoService("com.sun.star.io.TextInputStream")
oInputStream.setInputStream(oUcb.openFileRead(ConvertToURL(InFileName)))
oInputStream.setEncoding("cp866")
Do While Not oInputStream.isEOF()
s = oInputStream.readLine()
        s=Ltrim(s)
    If (len(s) >0) Then 'если строка не пустая
 
  'наименование банка или почты 
        If s Like WordORG & "*" Then 
      sOrg = Split(s, "|")(10) 'ПАО Сбербанк</НаименованиеОрганизации>
          ' oCell=oSheet.getCellByPosition(CurCol+1, CurRow)
      ' oCell.setString(sOrg)
        '   CurRow = CurRow + 1
        End If
 
 
 
  sVid=Left(s,10) 'слово начисление
If sVid = "НАЧИСЛЕНИЕ" Then
    a=2
     
   
'КБК
       If s Like WordNach & "*" Then
       sNach = Split(s, "|")(2)'2
      'oCell=oSheet.getCellByPosition(CurCol, CurRow)
'oCell.setString(sNach)
   End If
   

       
'номер из 1с
  If s Like "*" & WordNumP &"*" Then
    sNumP = Split(s, "|")(5)
          ' oCell=oSheet.getCellByPosition(CurCol, CurRow)
  ' oCell.setString(sNump)
        End If

 
'тип выплаты 0301 или 0201
        sTip=" "
        If s Like WordTip & "*" Then
        sTip = Split(s, "|")(1) '02010000
        sTip = Left(sTip,Len(sTip)-2) 'оставляем 0201
       
          ' oCell=oSheet.getCellByPosition(CurCol+2, CurRow)
  ' oCell.setString(sTip)
        End If
  If (Right(Str(sTip),2)="00") Then
       
'сумма 1
       If s Like WordNach & "*" Then
       sSum1 = Split(s,"|")(3)
       sSum_1 =Val(sSum1)
'   oCell=oSheet.getCellByPosition(CurCol+4, CurRow)
    ' oCell.setString(sSum1)
        End If
           
'сумма 2
       If s Like WordNach & "*" Then
       sSum2 = Split(s,"|")(4)
       sSum_2 =Val(sSum2)
  '  oCell=oSheet.getCellByPosition(CurCol+5, CurRow)
    ' oCell.setString(sSum2)
        End If           
       
'сумма 3
       If s Like WordNach & "*" Then
       sSum3 = Split(s,"|")(5)
       sSum_3 =Val(sSum3)
   ' oCell=oSheet.getCellByPosition(CurCol+6, CurRow)
    ' oCell.setString(sSum3)
        End If       
           
'сумма 4
       If s Like WordNach & "*" Then
       sSum4 = Split(s,"|")(6)
       sSum_4 =Val(sSum4) 
'   oCell=oSheet.getCellByPosition(CurCol+7, CurRow)
    ' oCell.setString(sSum4)
        End If
           
'сумма 5
       If s Like WordNach & "*" Then
       sSum5 = Split(s,"|")(7)
       sSum_5 =Val(sSum5)
  '  oCell=oSheet.getCellByPosition(CurCol+8, CurRow)
    ' oCell.setString(sSum5)
        End If           
       
'сумма 6
       If s Like WordNach & "*" Then
       sSum6 = Split(s,"|")(8)
       sSum_6 =Val(sSum6)
  '  oCell=oSheet.getCellByPosition(CurCol+9, CurRow)
    ' oCell.setString(sSum6)
        End If
       
'сумма 7
       If s Like WordNach & "*" Then
       sSum7 = Split(s,"|")(9)
       sSum_7 =Val(sSum7)
  '  oCell=oSheet.getCellByPosition(CurCol+10, CurRow)
   ' oCell.setString(sSum7)
        End If
           
'сумма 8
       If s Like WordNach & "*" Then
       sSum8 = Split(s,"|")(10)
       sSum_8 =Val(sSum8)
  '  oCell=oSheet.getCellByPosition(CurCol+11, CurRow)
    ' oCell.setString(sSum8)
        End If           
       
'сумма 9
       If s Like WordNach & "*" Then
       sSum9 = Split(s,"|")(11)
       sSum_9 =Val(sSum9) 
  ''  oCell=oSheet.getCellByPosition(CurCol+12, CurRow)
    ' oCell.setString(sSum9)
        End If       
           
'сумма 10
       If s Like WordNach & "*" Then
       sSum10 = Split(s,"|")(12)'12
       sSum_10 =Val(sSum10) 
  '  oCell=oSheet.getCellByPosition(CurCol+13, CurRow)
    ' oCell.setString(sSum10)
        End If
           
'сумма 11
       If s Like WordNach & "*" Then
       sSum11 = Split(s,"|")(13)'13)
       sSum_11 =Val(sSum11)
'   oCell=oSheet.getCellByPosition(CurCol+14, CurRow)
    ' oCell.setString(sSum11)
        End If           
       
'сумма 12
       If s Like WordNach & "*" Then
       sSum12 = Split(s,"|")(14)'14)
       sSum_12 =Val(sSum12)
   ' oCell=oSheet.getCellByPosition(CurCol+15, CurRow)
    ' oCell.setString(sSum12)
        End If 
       
'сумма 13
       If s Like WordNach & "*" Then
       sSum13 = Split(s,"|")(15)'15
       sSum_13 =Val(sSum13)
  '  oCell=oSheet.getCellByPosition(CurCol+16, CurRow)
    ' oCell.setString(sSum13)
        End If
       
'сумма 14
       If s Like WordNach & "*" Then
       sSum14 = Split(s,"|")(16)'16
       sSum =Val(sSum14)
   ' oCell=oSheet.getCellByPosition(CurCol+1, CurRow)
    'oCell.setString(sSum14)
        End If               
    'CurRow = CurRow + 1
   
' If (sTip="0000" ) Then 'если строка не пустая
If (sNach>0 ) Then 'если строка не пустая

       

       
       ' поиск КБК
            i=0 ' за что отвечает
            j=0  ' за что отвечает
           
            For i=0 To iorg-1 '0 - 1 значение, 1 - 2 значение
'           
               If (sOrg=masorg(i)) Then 'если кбк = кбк в массиве Мне это условие не нравится
                 
                   j=i+1 'переходим к след
               End If
            next
          If (j=0) Then
          'If (sTip="0000" ) Then 'если строка не пустая
         
                iorg=iorg+1
             
                massum(iorg-1)=sSum
               ' maskbk(iorg-1)=sNach
                masorg(iorg-1)=sOrg
                mastip(iorg-1)=sTip
                masnump(iorg-1)=sNumP
                massum1(iorg-1)=sSum_1
    massum2(iorg-1)=sSum_2
    massum3(iorg-1)=sSum_3
    massum4(iorg-1)=sSum_4
    massum5(iorg-1)=sSum_5
    massum6(iorg-1)=sSum_6
    massum7(iorg-1)=sSum_7
    massum8(iorg-1)=sSum_8
    massum9(iorg-1)=sSum_9
    massum10(iorg-1)=sSum_10
    massum11(iorg-1)=sSum_11
massum12(iorg-1)=sSum_12
    massum13(iorg-1)=sSum_13
    masvid(iorg-1)=sVid
   
          Else
         
         
                massum(j-1)=massum(j-1)+sSum
                massum1(j-1)=massum1(j-1)+sSum_1
                massum2(j-1)=massum2(j-1)+sSum_2
                massum3(j-1)=massum3(j-1)+sSum_3
                massum4(j-1)=massum4(j-1)+sSum_4   
            massum5(j-1)=massum5(j-1)+sSum_5
              massum6(j-1)=massum6(j-1)+sSum_6
              massum7(j-1)=massum7(j-1)+sSum_7
              massum8(j-1)=massum8(j-1)+sSum_8
              massum9(j-1)=massum9(j-1)+sSum_9
              massum10(j-1)=massum10(j-1)+sSum_10
              massum11(j-1)=massum11(j-1)+sSum_11
              massum12(j-1)=massum12(j-1)+sSum_12
              massum13(j-1)=massum13(j-1)+sSum_13
             
           
               
          End If
         End If 
       ' далее обработка этого КБК     
        End If       
        End If
        End IF
       
Loop
oInputStream.closeInput()
    kolop = kolop + 1
    If a=1 Then
   msgbox InFileName + " - это не 32 ведомость!"
   Stop
    End If
   
Loop




oCell=oSheet.getCellByPosition(CurCol, CurRow)
oCell.setString("Код строки")

oCell=oSheet.getCellByPosition(CurCol+1, CurRow)
oCell.setString("Наименование доставочной организации")
       
oCell=oSheet.getCellByPosition(CurCol+2, CurRow)
oCell.setString("Нач.за тек.мес.(4)")
oCell=oSheet.getCellByPosition(CurCol+3, CurRow)
oCell.setString("Нач.за прош.время(5)")
oCell=oSheet.getCellByPosition(CurCol+4, CurRow)
oCell.setString("уд.перепл.всего(6)")
oCell=oSheet.getCellByPosition(CurCol+5, CurRow)
oCell.setString("уд.перепл.в т.ч. тек.фин.года(7)")
oCell=oSheet.getCellByPosition(CurCol+6, CurRow)
oCell.setString("уд.по испол.док(8)")
oCell=oSheet.getCellByPosition(CurCol+7, CurRow)
oCell.setString("уд.по проч.основ(9)")
oCell=oSheet.getCellByPosition(CurCol+8, CurRow)
oCell.setString("сумма платы за стацион.обслуж. к переч(10)")
oCell=oSheet.getCellByPosition(CurCol+9, CurRow)
oCell.setString("возврат суммы, неполуч.взыск(11)")
oCell=oSheet.getCellByPosition(CurCol+10, CurRow)
oCell.setString("сумма к выплате 4+5-6-8-9-10+11 (12)")
oCell=oSheet.getCellByPosition(CurCol+11, CurRow)
oCell.setString("сумма неопл(не прекр.выпл) тек(13")
oCell=oSheet.getCellByPosition(CurCol+12, CurRow)
oCell.setString("сумма неопл(не прекр.выпл) возобн.из приост(14)")
oCell=oSheet.getCellByPosition(CurCol+13, CurRow)
oCell.setString("сумма неопл(не прекр.выпл) иная(15)")
oCell=oSheet.getCellByPosition(CurCol+14, CurRow)
oCell.setString("сумма восстан из прекращ(16)")
oCell=oSheet.getCellByPosition(CurCol+15, CurRow)
oCell.setString("сумма к доставке (12+13+14+15+16)(15)")

CurRow=CurRow+1       
For i=0 To iorg

oCell=oSheet.getCellByPosition(CurCol, CurRow)
oCell.setString(masnump(i))
oCell=oSheet.getCellByPosition(CurCol+1, CurRow)
oCell.setString(masorg(i))
'oCell=oSheet.getCellByPosition(CurCol+2, CurRow)
'oCell.setString(massum(i))
oCell=oSheet.getCellByPosition(CurCol+2, CurRow)
oCell.setString(massum1(i))
oCell=oSheet.getCellByPosition(CurCol+3, CurRow)
oCell.setString(massum2(i))
oCell=oSheet.getCellByPosition(CurCol+4, CurRow)
oCell.setString(massum3(i))
oCell=oSheet.getCellByPosition(CurCol+5, CurRow)
oCell.setString(massum4(i))
oCell=oSheet.getCellByPosition(CurCol+6, CurRow)
oCell.setString(massum5(i))
oCell=oSheet.getCellByPosition(CurCol+7, CurRow)
oCell.setString(massum6(i))
oCell=oSheet.getCellByPosition(CurCol+8, CurRow)
oCell.setString(massum7(i))
oCell=oSheet.getCellByPosition(CurCol+9, CurRow)
oCell.setString(massum8(i))
oCell=oSheet.getCellByPosition(CurCol+10, CurRow)
oCell.setString(massum9(i))
oCell=oSheet.getCellByPosition(CurCol+11, CurRow)
oCell.setString(massum10(i))
oCell=oSheet.getCellByPosition(CurCol+12, CurRow)
oCell.setString(massum11(i))
oCell=oSheet.getCellByPosition(CurCol+13, CurRow)
oCell.setString(massum12(i))   
oCell=oSheet.getCellByPosition(CurCol+14, CurRow)
oCell.setString(massum13(i))
oCell=oSheet.getCellByPosition(CurCol+15, CurRow)
oCell.setString(massum(i))
oCell=oSheet.getCellByPosition(CurCol+16, CurRow)
oCell.setString(masvid(i))
CurRow=CurRow+1

Next i


j1=0
j2=0
j3=0
j4=0
j5=0
j6=0
j7=0
j8=0
j9=0
j10=0
j11=0
j12=0
j13=0
j=0

For i=0 To iorg
    j1=j1+massum1(i)
    j2=j2+massum2(i)
    j3=j3+massum3(i)
    j4=j4+massum4(i)
    j5=j5+massum5(i)
    j6=j6+massum6(i)
    j7=j7+massum7(i)
    j8=j8+massum8(i)
    j9=j9+massum9(i)
    j10=j10+massum10(i)
    j11=j11+massum11(i)
    j12=j12+massum12(i)
    j13=j13+massum13(i)
    j=j+massum(i)
Next


oCell=oSheet.getCellByPosition(CurCol+2, CurRow)
oCell.setString(j1)
oCell=oSheet.getCellByPosition(CurCol+3, CurRow)
oCell.setString(j2)
oCell=oSheet.getCellByPosition(CurCol+4, CurRow)
oCell.setString(j3)
oCell=oSheet.getCellByPosition(CurCol+5, CurRow)
oCell.setString(j4)
oCell=oSheet.getCellByPosition(CurCol+6, CurRow)
oCell.setString(j5)
oCell=oSheet.getCellByPosition(CurCol+7, CurRow)
oCell.setString(j6)
oCell=oSheet.getCellByPosition(CurCol+8, CurRow)
oCell.setString(j7)
oCell=oSheet.getCellByPosition(CurCol+9, CurRow)
oCell.setString(j8)
oCell=oSheet.getCellByPosition(CurCol+10, CurRow)
oCell.setString(j9)
oCell=oSheet.getCellByPosition(CurCol+11, CurRow)
oCell.setString(j10)
oCell=oSheet.getCellByPosition(CurCol+12, CurRow)
oCell.setString(j11)
oCell=oSheet.getCellByPosition(CurCol+13, CurRow)
oCell.setString(j12)
oCell=oSheet.getCellByPosition(CurCol+14, CurRow)
oCell.setString(j13)
oCell=oSheet.getCellByPosition(CurCol+15, CurRow)
oCell.setString(j)

End Sub
С уважением,
Михаил Каганский

Atlant_50

Ребят! Огромное всем спасибо за то, что откликнулись и пришли на помощь! Вы все гении!

Atlant_50

Михаилу выражаю отдельную благодарность! Спасибо Вам! Очень выручили! )))