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

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

QA

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

답변 4

본문

안녕하세요.
.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가 짤려버립니다.. ㅠ.ㅠ
어떻게 해야 할까요?

답변을 작성하시기 전에 로그인 해주세요.
QA 내용 검색
질문등록
전체 13
© SIRSOFT
현재 페이지 제일 처음으로