Что нового

[Данные, строки] Чтение с 1 по 10 символ в строке текстового документа.

xlgrgrc

Знающий
Сообщения
91
Репутация
7
Привет всем.

Имеется текстовый документ (111.txt) формата:

Код:
533491,868	2175339,949 	-21,898 
543539,878	2195282,796 	-21,900 
543573,591	2195243,042 	-21,900 
543584,613	2195248,936 	-21,900


в первом столбике всегда 10 знаков, во втором всегда 11 знаков и начинаются всегда с 21!


Вопрос:
нужно поменять столбики местами. А именно: 3 столбик удалить, первый со вторым поменять местами.

Решить хотел так:
- Создать массив и присваивать построчно цифры с 1 по 10 первому члену массива, с цифр 21 отсчитать 11 символов и присвоить второму...
- поменять местами уже можно на выходе когда будет формироваться новый текстовый документ - проблем ноль.

Натолкните на функцию что бы можно было взять в определенной строчке определенные символы - то есть с 1 по 10

пробовал:
Код:
#include <file.au3>
#include <array.au3>

$file = FileOpen("e:\0. Работа\1. Переводы\2012.03.28 300-368\4. 300-368 после тл", 0)

For $i = 1 to 5
   $line = FileReadLine($file)
   
   MsgBox (1, "Сообщение", $line)
   
   $aData = StringSplit($Line, ',', 11)
   $sData1 = $aData[0]
   $sData2 = $aData[1]
   MsgBox (1, "Сообщение", $line)
   MsgBox(0, "Data", $sData1)
Next


но не до конца понял как работает StringSplit.
 

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
А структура файла всегда так выглядит?

Если да то можно так:
Код:
#Include <Array.au3>

Global $sOut[1][2] = [[0, 0]]

$hFile = FileOpen('test.txt')
While 1
    $sLine = FileReadLine($hFile)
    If @error = -1 Then ExitLoop
    $sSplit = StringSplit($sLine, ' ')
    $sOut[0][0] += 1
    ReDim $sOut[$sOut[0][0] + 1][UBound($sOut, 2)]
	$sOneColumn = StringSplit($sSplit[1], ',')
	$sTwoColumn = StringSplit($sSplit[3], ',')
    $sOut[$sOut[0][0]][0] = $sOneColumn[2] & ',' & $sOneColumn[1]
    $sOut[$sOut[0][0]][1] = $sTwoColumn[2]
Wend    
FileClose($hFile)
_ArrayDisplay($sOut)

For $i = 1 To $sOut[0][0]
    FileWrite('Out.txt', $sOut[$i][0] & '  ' & $sOut[$i][1] & @CRLF)
Next

Или так:
Код:
#Include <Array.au3>

$hFile = FileOpen('test.txt')
While 1
    $sLine = FileReadLine($hFile)
    If @error = -1 Then ExitLoop
	$sOne = StringLeft(StringLeft($sLine, 10), 6)
	$sTwo = StringRight(StringLeft($sLine, 10), 3)
	$sThree = StringRight(StringLeft($sLine, 24), 4)
	FileWrite('Out.txt', $sTwo & ',' & $sOne & '  ' & $sThree & @CRLF)
Wend    
FileClose($hFile)
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
xlgrgrc
просто подправил твой скрипт
Код:
#include <file.au3>
#include <array.au3>

$file = FileOpen("e:\0. Работа\1. Переводы\2012.03.28 300-368\4. 300-368 после тл", 0)

For $i = 1 to 5
   $line = FileReadLine($file)
   
   MsgBox (1, "Сообщение", $line)

   $sData1 = StringMid($line, 21, 11)
   $sData2 = StringLeft($line, 10)
   
   MsgBox (1, "Сообщение", $line)
   MsgBox(0, "Data", "Data1 = "& $sData1 & @CRLF & "Data2 = "& $sData2)
Next
 

AZJIO

Меценат
Меценат
Сообщения
2,879
Репутация
1,194
Код:
#include <file.au3>
Global $aRecords

If Not _FileReadToArray(@ScriptDir&'\1.txt',$aRecords) Then
   MsgBox(4096,"Ошибка", " Ошибка чтения файла в массив. @error=" & @error)
   Exit
EndIf
$String=''
For $i = 1 to $aRecords[0]
	$aRecords[$i]=StringStripWS($aRecords[$i], 4) ; удаляет лишние пробелы
	$a = StringSplit($aRecords[$i]," ") ; деление строки поэлементам
	If Not @error And $a[0]>1 Then $String &= $a[2]&' '&$a[1] &@CRLF
Next
$String=StringTrimRight($String, 2)
If MsgBox(4,"Сохранить?",$String)=6 Then
	$file = FileOpen(@ScriptDir&'\2.txt',2)
	FileWrite($file, $String)
	FileClose($file)
EndIf
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
xlgrgrc [?]
нужно поменять столбики местами. А именно: 3 столбик удалить, первый со вторым поменять местами.
Код:
Global $sTemp

$hFileIn = FileOpen(@ScriptDir & "\testin.txt", 0)
$hFileOut = FileOpen(@ScriptDir & "\testout.txt", 2)
If $hFileIn = -1 Then
    MsgBox(0, "Error", "Unable to open file.")
    Exit
EndIf

While 1
    Local $sLine = FileReadLine($hFileIn)
    If @error = -1 Then ExitLoop
	$sTemp &= StringRegExpReplace($sLine, '^(.*?)\s+(.*?)\s+(.*?)$', '$2'& Chr(32) & Chr(32) &'$1' & @CR)
  
WEnd

ConsoleWrite($sTemp)

FileWrite($hFileOut, $sTemp)

FileClose($hFileOut)
FileClose($hFileIn)
 
Автор
X

xlgrgrc

Знающий
Сообщения
91
Репутация
7
Ого. Спасибо парни. Думаю разберусь дальше. Много вариантов предложили ))) Сейчас буду пробовать ))) :smile:
 
Автор
X

xlgrgrc

Знающий
Сообщения
91
Репутация
7
Все сделал ))) Работает как часики )))

Использовал:
Код:
$sOne = StringLeft(StringLeft($sLine, 10), 6)
  $sTwo = StringRight(StringLeft($sLine, 10), 3)


Попереставлял цифры. Подстроил под себя.
Понял как работает более или менее )))

Спасибо всем ещё раз...
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
Код:
$sOne = StringLeft(StringLeft($sLine, 10), 6)

эквивалентно
Код:
$sOne = StringLeft($sLine, 6)


Код:
$sTwo = StringRight(StringLeft($sLine, 10), 3)

эквивалентно
Код:
$sTwo = StringMid($sLine, 8, 3)
 
Верх