2026, 새로운 도약을 시작합니다.

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

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

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

<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>

... (계속된 데이터)

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

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

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

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

정규식이나 sscanf 등으로도 가능할까요?

$adifdata=$datafile;

while (전체 row 만큼) {
  내용 parser
  db저장
}

귀한 답변 부탁드립니다.

답변 4개

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

답변에 대한 댓글 7개

이게 안 되어서요... call 만 되고 다른 항목은 어떻게 해야할지 몰라서요..
적용하신 소스를 올려 보세요.
그리고 저도 ham에 관심이 있는데 이런 소스는 어디서 받아 오는 건가요?
<?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>";
};
?>
위 소스에 문제는 무엇인가요?
time_on 이.출력이 안되네요
while($record = $p->get_record())
print_r( $record);

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

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

https://github.com/magicbug/phpadifparser

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

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

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

답변에 대한 댓글 6개

답변 정말 감사드립니다.
파싱해 보니 항목은 다 나오는데
<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가 짤려버립니다.. ㅠ.ㅠ
어떻게 해야 할까요?
위 프로그램은 영문 전용인 듯합니다.
한글이 있는 경우는 또 수정해야 할 듯하군요.
아... 그렇군요... 어떻게 해야할까요.. 이리저리 해 봐도 안되네요 ㅠ.ㅠ
한번 의뢰해 보시는 건 어떤가요?
어디로요??? 자금이나 이런게 있는게 아니라 불가능할것 같습니다. 취미로 하는 부분이라서요
한글만 안짤리게 방법이 없을까요???

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

<QSO_DATE:8>12345678

:8

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

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

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

답변에 대한 댓글 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>
날짜만 필요하다고 하셨으니
$qso_date=substr( $line, 12, 8);
날짜만 필요한것이 아니라 한줄 한줄 저런 형식의 데이타 전부 필요한것입니다.

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

<QSO_DATE:8>20220109<STATION_CALLSIGN:6>

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

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

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

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

답변에 대한 댓글 3개

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

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

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

로그인
🐛 버그신고