테스트 사이트 - 개발 중인 베타 버전입니다

.adi ADIF parser 하고자 합니다. 정규식으로 어떻게 해야 할까요? 채택완료

주민 3년 전 조회 1,857

안녕하세요. .adi ADIF 형식의 파일을 읽어들여서 parser 하고자 합니다. api 오픈소스 찾아 봤지만 잘 안되어서 올려봅니다.

 

test.adi 파일이 있다면 내용이 아래처럼 나옵니다.

 

20220109TEST11TEST112228TEST22INT45029테스트 20220109TEST11TEST112305TEST22INT45030

... (계속된 데이터)

 

위와 같이 파일 내용이 쭉 들어가 있으면

시작 끝이고 이게 1줄 row 입니다. 20220109 을 보면 QSO_DATE 변수에 :8 8자리 20220109 데이터가 됩니다.

이걸 정규식 등을 이용 parser 해서 DB에 데이터만 저장하고자 합니다.

 

즉 파일읽어들임 파일 내용 전체 변수 예로 $adidata 에 저장하고 1줄 1줄 읽어들여서 전체를 다 DB로 저장하고자 합니다. 즉 한줄 정규식 등으로 파싱해서 DB저장 반복 하고자 합니다. 위 데이터 전체를 돌면서, 정규식 파싱하는 방법 어떻게 하면 좋을까요?

 

정규식이나 sscanf 등으로도 가능할까요? $adifdata=$datafile; while (전체 row 만큼) {   내용 parser   db저장 }

 

귀한 답변 부탁드립니다.

 

댓글을 작성하려면 로그인이 필요합니다.

답변 4개

채택된 답변
+20 포인트
로그인 후 평가할 수 있습니다

답변에 대한 댓글 7개

주민
3년 전
이게 안 되어서요... call 만 되고 다른 항목은 어떻게 해야할지 몰라서요..
엑스엠엘
3년 전
적용하신 소스를 올려 보세요.
그리고 저도 ham에 관심이 있는데 이런 소스는 어디서 받아 오는 건가요?
주민
3년 전
<?php
include 'adif_parser.php';

$p = new ADIF_Parser;
$p->load_from_file("ds5eps.adif");
$p->initialize();

while($record = $p->get_record())
{
if(count($record) == 0)
{
break;
};
echo $record["call"]."<br>";
echo $record["TIME_ON"]."<br>";
};
?>
엑스엠엘
3년 전
위 소스에 문제는 무엇인가요?
주민
3년 전
time_on 이.출력이 안되네요
엑스엠엘
3년 전
while($record = $p->get_record())
print_r( $record);

이렇게 해서 각 record가 어떻게 생겼는지 한번 살펴 보세요.
주민
3년 전
네 확인해 보고 있는데 제대로 나오지 않는군요.. 흠..
parser 가 정확히 안되네요 흠..
http://hanlogbook.com 에 적용할 예정입니다.

댓글을 작성하려면 로그인이 필요합니다.

https://github.com/magicbug/phpadifparser" rel="nofollow noreferrer noopener" target="_blank">https://github.com/magicbug/phpadifparser

여기 class에서 다음을 수정하세요.

                                while($len > 0)                                 {                                         $value = $value.$record[$a];                                         $len--;                                         $a++;                                 }$a--;     /* $a--;  이것을 추가하세요. */

로그인 후 평가할 수 있습니다

답변에 대한 댓글 6개

주민
3년 전
답변 정말 감사드립니다.
파싱해 보니 항목은 다 나오는데
<QSO_DATE:8>20220109<STATION_CALLSIGN:6>DS5EEE<OPERATOR:6>DS5XXX<TIME_ON:4>1518<CALL:5>HL5LAL<MODE:3>INT<FREQ:5>45029<COMMENT:10>주례 보훈병원 아이볼<EOR>
=> parser 후
20220109 / DS5EEE / DS5XXX / 1518 / HL5LAL / INT / 45029/ / / / / / / 주례 보
한글 comment가 짤려버립니다.. ㅠ.ㅠ
어떻게 해야 할까요?
엑스엠엘
3년 전
위 프로그램은 영문 전용인 듯합니다.
한글이 있는 경우는 또 수정해야 할 듯하군요.
주민
3년 전
아... 그렇군요... 어떻게 해야할까요.. 이리저리 해 봐도 안되네요 ㅠ.ㅠ
엑스엠엘
3년 전
한번 의뢰해 보시는 건 어떤가요?
주민
3년 전
어디로요??? 자금이나 이런게 있는게 아니라 불가능할것 같습니다. 취미로 하는 부분이라서요
주민
3년 전
한글만 안짤리게 방법이 없을까요???

댓글을 작성하려면 로그인이 필요합니다.

12345678

:8

이것이 데이터(값)길이군요.

substr()로 자르고, 숫자 추출해서 다음(값)부분 자르고 하면 금방되겠네요.

로그인 후 평가할 수 있습니다

답변에 대한 댓글 3개

주민
3년 전
감사합니다.
제가 올려드린 아래 데이터를 기준으로 어떻게 구현해야할까요?
2 ROW인데요... 흠... 감이 안와서요...
<QSO_DATE:8>20220109<STATION_CALLSIGN:6>TEST11<OPERATOR:6>TEST11<TIME_ON:4>2228<CALL:6>TEST22<MODE:3>INT<FREQ:5>45029<COMMENT:9>테스트<EOR>
<QSO_DATE:8>20220109<STATION_CALLSIGN:6>TEST11<OPERATOR:6>TEST11<TIME_ON:4>2305<CALL:6>TEST22<MODE:3>INT<FREQ:5>45030<EOR>
엑스엠엘
3년 전
날짜만 필요하다고 하셨으니
$qso_date=substr( $line, 12, 8);
주민
3년 전
날짜만 필요한것이 아니라 한줄 한줄 저런 형식의 데이타 전부 필요한것입니다.

댓글을 작성하려면 로그인이 필요합니다.

20220109

여기서 그냥 날짜만 뽑는 거라면

그냥 substring() 하시는 것이 편할 듯합니다.

https://www.php.net/manual/en/function.substr.php

로그인 후 평가할 수 있습니다

답변에 대한 댓글 3개

주민
3년 전
항목별로 저형식대로 되어 있는걸 전체 다 뽑아야합니다. ^^;
엑스엠엘
3년 전
가변 길이만 아니면 substr()로도 가능합니다.
주민
3년 전
한줄의 시작은 <QSO_DATE:8>12345678... 끝은 <EOR> 로 한줄 row 데이터가 끝납니다.
항목은 가변적으로 다를 수 있고 형식은 <$str:$length>$data 형식이 됩니다.
이런 형식을 parser 하는걸 만들고 싶습니다.

댓글을 작성하려면 로그인이 필요합니다.

답변을 작성하려면 로그인이 필요합니다.

로그인