2013-05-21 3 views
1

파일의 각 줄이 하루 데이터를 나타낼 때 텍스트 파일에 저장된 일일 주가가있는 파일이 있습니다. 예를 들어 :새 줄을 파일에 추가 할 때 빈 줄 제거하기 (Perl에서)

20/05/2013 23.46 23.58 23.43 23.57 32884800 23.57 
17/05/2013 23.27 23.48 23.2 23.46 41037700 23.46 

을 나는 현재 날짜에 비교하면 동일하지 갱신합니다 (마지막 날짜가 파일의 맨 위에 나타납니다) 저장된 파일의 마지막 날짜를 확인하는 업데이트 프로그램을 만들었습니다 누락 된 행만 추가하여 데이터 누락 (새 행이 기존 파일의 맨 위에 추가됨).

open my $in, '<', $file  or die "Can't read old file: $!"; 
open my $out, '>', "$file.new" or die "Can't write new file: $!"; 

print $out "# Add this line to the top\n"; 

while(<$in>) 
    { 
    print $out $_; 
    } 

close $out; 

를 그리고 일반적으로는 하나의 문제를 잘 작동 :

나는 선을 추가 할 this 접근 방식을 사용했다. 가장 오래된 줄과 새로 추가 된 첫 줄 사이에 하나의 빈 줄이 추가됩니다. 예를 들어, 내 마지막으로 저장 한 날짜는

15/05/2013 23.04 23.25 22.91 23.24 40153000 23.24 

경우 한 후 새로운 라인이 추가되는 :

16/05/2013 23.1 23.35 23.1 23.27 33023300 23.27 

그것은 그 다음과 같이 표시됩니다

15/05/2013 23.04 23.25 22.91 23.24 40153000 23.24 

16/05/2013 23.1 23.35 23.1 23.27 33023300 23.27 

을 나는 그것을 같이 할 그 :

15/05/2013 23.04 23.25 22.91 23.24 40153000 23.24 
16/05/2013 23.1 23.35 23.1 23.27 33023300 23.27 

나는 ge 라인을 추가 할 때 \n을 없애면 하나의 긴 문자열이 생성됩니다. 나는 어쨌든 \n을 제거해야하지만 마지막 줄을 위해서라고 생각합니다. 어떻게해야합니까?

EDIT : 줄 끝은 LF이 아닌 CRLF 인 것 같습니다. 그게 중요합니까? 현재 라인이이 빈 라인 패턴과 일치하지 않거나 다음과 같습니다 : /^\s*$/ 또는이 : /^$/입니다.

답변

1

chomp을 사용하면 지능형으로 (CRLF가 번역되지 않은 경우) 개행을 먹은 다음 실제로 개행 문자를 출력 할 수 있습니다. 그 사이에 줄이 비어 있으면 건너 뛸 수 있습니다.

while(<$in>) 
{ 
    chomp; chomp;  # Eat up to two newlines, just in case 
    next if /^\s*$/;  # Line is empty or contains whitespace 
    print $out "$_\n"; 
} 
+0

내 코드를 변경 한 후에 고맙습니다. 파일 모양을 변경하지 않았습니다. 여전히 빈 줄을 보여줍니다. BTW, 나는 빈 파일을 확인하기 위해,이 정규식은'\ s *'없이'/^\ s * $ /'로 사용되어야한다고 생각한다. 그러나이 변화가 있은 후에도 그 계보는 계속됩니다. –

+0

나는 빈 줄이 CRLF가 아니라 LF 인 것으로 나타났습니다. 그런 정규식을 사용할 때 중요합니까 :'/^$ /'? 감사! –

+0

괜찮습니다. 선택 사항 인 공백 문자를 사용하여 문자열 전체를 일치시키는 것뿐입니다. 그 chomps 다음에 문자열에 CR 또는 LF 문자가 없어야합니다. 그래서 우리는 명시 적으로 하나를 씁니다. 편집증일지도 모르지만 때로 Windows 스타일의 텍스트 파일을 다루는 경우에는 나쁜 습관이 아닙니다. – paddy

관련 문제