본문 바로가기

AUTOHOTKEY/레퍼런스

Loop,READ 텍스트 파일을1행씩 읽어들여, 반복 처리를 실시한다

Loop,READ

텍스트 파일을1행씩 읽어들여, 반복 처리를 실시한다

Loop, Read, InputFile [, OutputFile, FutureUse]

Parameters


인수명 설명
Read 제일 인수는 「READ」라고 한다.변수에 격납해 참조해도 상관없다.
InputFile 읽어들이고 싶은 파일명.
상대 패스로 지정하면, %A_WorkingDir% (으)로부터 검색된다.
OutputFile 루프의 사이, FileAppend커멘드를 제2인수를 생략 해 실행하면, 이 파일에 써진다.
루프중에서 최초로FileAppend(을)를 사용했을 때에 열려 그 후 루프를 빠질 때까지 연 채로 있다.
커멘드를 실행할 때마다 다시 여는 것이 없기 때문에, 제2인수를 붙여 실행하는 것보다 퍼포먼스가 좋아진다.
상대 패스로 지정하면, %A_WorkingDir% (으)로부터 검색된다.
파일명의 선두에 「*」(을)를 붙이면, 바이너리 모드로 열려 개행 코드의 자동변역(LF→CR+LF)(을)를 하지 않게 된다.
파일명을 「*」라고 하면, 제2인수 없음의 FileAppend그리고 스크립트의 표준 출력에 문자열을 출력할 수 있다.
FutureUse 장래의 확장을 위해서 확보되고 있다.현재 이 인수는 무시된다.

Remarks

읽어내진 행(개행은 포함하지 않는다)(은)는 「A_LoopReadLine」로서 참조할 수 있다.

65534문자를 넘는 행은, 여러 차례로 나누어 읽힌다.

개행 코드는,CR+LF(와)과LF에 대응(CR에는 비대응)

파일의 각 행을 읽어내려면 , FileReadLine커멘드를 사용하는 방법도 있지만,Loop, Read(을)를 사용하는 편이 효율이 좋다.

읽어들인 행을 StringSplit커멘드나 Loop,PARSE그리고 더욱 분할할 수도 있다.

그 외의 사양은, 통상의 Loop(와)과 같이.


Related

FileRead, FileReadLine, FileAppend, Sort, Loop, Break, Continue, Blocks, FileSetAttrib, FileSetTime


Example(s)

; Example #1: Only those lines of the 1st file that contain
; the word FAMILY will be written to the 2nd file.  Uncomment
; this line to overwrite rather than append to any existing file:
;FileDelete, C:\Docs\Family Addresses.txt

Loop, read, C:\Docs\Address List.txt, C:\Docs\Family Addresses.txt
{
	IfInString, A_LoopReadLine, family, FileAppend, %A_LoopReadLine%`n
}

; Example #2: A working script that attempts to extract all FTP and HTTP
; URLs from a text or HTML file:
FileSelectFile, SourceFile, 3,, Pick a text or HTML file to analyze.
if SourceFile =
	return  ; This will exit in this case.

SplitPath, SourceFile,, SourceFilePath,, SourceFileNoExt
DestFile = %SourceFilePath%\%SourceFileNoExt% Extracted Links.txt

IfExist, %DestFile%
{
	MsgBox, 4,, Overwrite the existing links file? Press No to append to it.`n`nFILE: %DestFile%
	IfMsgBox, Yes
		FileDelete, %DestFile%
}

LinkCount = 0
Loop, read, %SourceFile%, %DestFile%
{
	URLSearchString = %A_LoopReadLine%
	Gosub, URLSearch
}
MsgBox %LinkCount% links were found and written to "%DestFile%".
return


URLSearch:
; It's done this particular way because some URLs have other URLs embedded inside them:
StringGetPos, URLStart1, URLSearchString, http://
StringGetPos, URLStart2, URLSearchString, ftp://
StringGetPos, URLStart3, URLSearchString, www.

; Find the left-most starting position:
URLStart = %URLStart1%  ; Set starting default.
Loop
{
	; It helps performance (at least in a script with many variables) to resolve
	; "URLStart%A_Index%" only once:
	StringTrimLeft, ArrayElement, URLStart%A_Index%, 0
	if ArrayElement =  ; End of the array has been reached.
		break
	if ArrayElement = -1  ; This element is disqualified.
		continue
	if URLStart = -1
		URLStart = %ArrayElement%
	else ; URLStart has a valid position in it, so compare it with ArrayElement.
	{
		if ArrayElement <> -1
			if ArrayElement < %URLStart%
				URLStart = %ArrayElement%
	}
}

if URLStart = -1  ; No URLs exist in URLSearchString.
	return

; Otherwise, extract this URL:
StringTrimLeft, URL, URLSearchString, %URLStart%  ; Omit the beginning/irrelevant part.
Loop, parse, URL, %A_Tab%%A_Space%<>  ; Find the first space, tab, or angle (if any).
{
	URL = %A_LoopField%
	break  ; i.e. perform only one loop iteration to fetch the first "field".
}
; If the above loop had zero iterations because there were no ending characters found,
; leave the contents of the URL var untouched.

; If the URL ends in a double quote, remove it.  For now, StringReplace is used, but
; note that it seems that double quotes can legitimately exist inside URLs, so this
; might damage them:
StringReplace, URLCleansed, URL, ",, All
FileAppend, %URLCleansed%`n
LinkCount += 1

; See if there are any other URLs in this line:
StringLen, CharactersToOmit, URL
CharactersToOmit += %URLStart%
StringTrimLeft, URLSearchString, URLSearchString, %CharactersToOmit%
Gosub, URLSearch  ; Recursive call to self.
return