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

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

QA

.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

https://github.com/magicbug/phpadifparser

<?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>";
};
?>

<QSO_DATE:8>20220109<STATION_CALLSIGN:6>

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

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

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

한줄의 시작은 <QSO_DATE:8>12345678... 끝은 <EOR> 로 한줄 row 데이터가 끝납니다.
항목은 가변적으로 다를 수 있고 형식은 <$str:$length>$data 형식이 됩니다.
이런 형식을 parser 하는걸 만들고 싶습니다.

<QSO_DATE:8>12345678

:8

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

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

감사합니다.
제가 올려드린 아래 데이터를 기준으로 어떻게 구현해야할까요?
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>

https://github.com/magicbug/phpadifparser

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

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

답변 정말 감사드립니다.
파싱해 보니 항목은 다 나오는데
<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가 짤려버립니다.. ㅠ.ㅠ
어떻게 해야 할까요?

답변을 작성하시기 전에 로그인 해주세요.
전체 129,103 | RSS
QA 내용 검색

회원로그인

(주)에스아이알소프트 / 대표:홍석명 / (06211) 서울특별시 강남구 역삼동 707-34 한신인터밸리24 서관 1402호 / E-Mail: admin@sir.kr
사업자등록번호: 217-81-36347 / 통신판매업신고번호:2014-서울강남-02098호 / 개인정보보호책임자:김민섭(minsup@sir.kr)
© SIRSOFT