programing

Regex를 사용하여 파일을 해석해야 합니까, 아니면 더 나은 방법이 있습니까?

goodsources 2022. 10. 20. 21:21
반응형

Regex를 사용하여 파일을 해석해야 합니까, 아니면 더 나은 방법이 있습니까?

해석해야 할 2000행 이상의 파일이 있습니다.100% 정확한 결과를 얻을 수 있는지 확인하고 싶습니다.이 결과는 MariaDB로 Import됩니다.

파일은 다음과 같습니다.

line 0: #start#
line 1: 20111211\200000
line 2: n=john|l=smith,131_stree_apt#102_city_state_11111_country,19989989988|17771112222,user%64domain.com,12,21,551|626|23\r
...
line 2156: #end#

즉, line 1은 24h 형식의 날짜 시각이고 line 2는 line 형식입니다.

  • n = 이름
  • l = 성
  • 풀 어드레스
  • 전화기+휴대전화
  • 이메일
  • 총목표
  • 총 패스
  • 얼음 위의 시간+벤치에서의 시간
  • 음경분

나는 정규 표현을 이해할 수 없다.다른 아이디어는 각 행을 해석하고 각 쉼표, 각 파이프 등을 해석하는 것입니다만, 이 접근방식은 regex보다 느리고 정확도가 낮다고 생각합니다.내 말이 맞니?

정규 표현을 알 수 없기 때문에 각 행을 해석하고 각 쉼표를 해석한 다음 각 파이프를 해석하는 것이 제 아이디어였습니다.이것은 regexp보다 더 느리고 정확하지 않다고 생각합니다.

가서 한 번 해보는 게 어때요?이게 암시하게 하지 말고 과감하게 행동하세요.일반적으로 내가 너라면 다음을 할 것이다.

  1. 간단한 구현
  2. 시험해 보다
  3. 튜닝

최대 2000개의 레코드는 많지 않기 때문에 세 번째 단계는 필요하지 않을 수 있습니다(특히 이 마이그레이션이 한 번만 실행되는 경우에는 2분이면 어떻게 됩니까?).

BTW: 이것은 일반적인 프로그래밍 조언으로 많은 문제에 적용됩니다.섣불리 최적화하지 마십시오.

파서를 작성하면 정규 표현보다 더 강력하고 쓰기 쉽고 추론하기 쉽습니다.

파일 문자를 한 글자씩 읽고, 각 문자에 대해 파일을 사용하여 수행할 작업을 결정합니다.

처음에는 '날짜'를 읽다가 새 줄을 찾으면 날짜 구문 분석이 완료되었음을 알 수 있습니다.

그런 다음 각 레코드를 분석합니다., 「 」 「 」 「 」 「 」를 볼 수 있습니다.n ' , 으면 안 될 것 같다'가 나올 때까지 계속 읽게 됩니다|l 글을 ,etc.치 못한 알 수 . 예상치 못한 것을 발견한 경우 파서에 오류가 있거나 데이터 파일에 오류가 있습니다.

파일을 완벽하게 읽으면 알 수 없습니다. 100%는 없습니다.'충분히 좋은' 것 밖에 없다.이것은 컴퓨터 과학의 일반법이다.

물론 완전한 코데즈를 알려드리진 않겠지만그러나 플레이스 홀더의 답변으로 기본적인 접근방식을 제시합니다.

preg_match('/
   ^
     n=(\w+)       # just alphanumerics
     \|
     l=(\w+)
     ,
     ([\w\h\#]+)    # mixture of letters and space and #
     ,
     ([^,]*)       # anything but commas
     ...
   $
  /x', $line, $match);

유사 CSV 행에 있는 필드 수만큼 문자 클래스 및 캡처 그룹만 있으면 됩니다. \d+소수점만 일치시키는 것도 유용할 수 있습니다.

여기서 기본적인 문자열 함수를 사용하여 가짜 파서를 쓰는 것은 분명 적절하지 않습니다.정확한 코드와 신뢰성이 높은 regex를 사용할 수 있습니다.

언급URL : https://stackoverflow.com/questions/8439699/should-i-use-regex-to-parse-my-file-or-is-there-a-better-way

반응형