2011-12-29 1 views
6

아버지를 돕기 위해 노력하고 있습니다. 스케쥴링 응용 프로그램에서 내보냈습니다. 우리는 mysql 데이터베이스로 가져올 수 있는지 확인하려고 노력하고 있으므로 동료와 온라인으로 공동 작업 할 수 있습니다.대단히 큰 공간으로 구분 된 파일 구문 분석

여러 가지 방법을 시도했지만 아무 것도 올바르게 작동하지 않는 것으로 나타났습니다. 이것은 제 전문 분야가 아닙니다.

수출은 여기에서 볼 수있다 : http://roikingon.com/export.txt

이 구문 분석에 대해 어떻게 이동하는 방법에 대한 어떤 도움/조언을 크게 감상 할 수있다!

감사합니다.

+0

조언 ... 음, 해당 내보내기의 데이터 형식을 알아야합니다. 또한 주소는 공백으로 구분되며 열 사이에 탭이 없습니다. 자동으로 구문 분석 할 정보가 부족한 것 같습니다. – alxx

+2

내 생각 엔 : 너비가 고정되어 있고 처음 세 문자가 레코드 유형입니다. 모든 레코드 유형은 동일한 형식을 갖습니다. 즉, 레코드 유형 4의 모든 행은 동일한 두 개의 열을 가지며 레코드 유형 17.1은 단 하나의 열만 포함하지만 새로운 "경로 블록"을 시작하는 것처럼 보입니다. – vstm

+2

데이터가 인라인되지 않는 형식이 잘못되었습니다. 이제 링크가 죽었으므로 질문을 맥락화하는 것이 불가능합니다. 또는 pastebin et al을 사용하십시오 ... 그냥 말입니다 .. – ftrotter

답변

2

(다소 동적 인) 고정 된 - 열 해석기를 작성하려고했습니다. 보세요 : http://codepad.org/oAiKD0e7 (너무 길기 때문에 대부분 "데이터"입니다). 내가 나타났습니다 무엇

  • 텍스트 데이터는
  • 수치 데이터가 오른쪽 왼쪽 "___42"
에 패딩과 정렬 "hello___" ( _ = 공간)처럼 오른쪽에 패딩 왼쪽 정렬됩니다

    : 당신이 내 코드를 사용하려면

    아직 할 일있다3210

  • 레코드 유형 12.x에는 가변 열 개수 (일부 정적 열 뒤에)가 있으므로 다른 "처리기"를 구현해야합니다.
  • 일부 너비가 잘못된 것 같습니다. 나는 시스템이 있다고 생각한다. (숫자는 4 자, 텍스트는 8 자, 특별한 경우에는 약간의 변형이있다.) 도메인 지식과 하나 이상의 샘플 파일을 가진 사람이 열을 파악할 수 있습니다.
  • 원시 데이터를 가져 오는 것은 첫 번째 단계 일뿐입니다. 원시 데이터를 유용한 모델로 매핑하고 해당 모델을 데이터베이스에 기록해야합니다.
+0

하! 나는 실제로 똑같은 일을하고 있습니다. 나는 약간 다른 tho 그것을했다. 나는 한 줄에 데이터의 배열을 반환하는 함수를 가진 큰 배열보다는 스위치를 사용했다. 좋은 물건! – Roi

1

정규식 (0 개 이상의 공백)으로 나누기를 사용할 수 있습니다.

나는 당신에게 알려줄 것입니다.

데이터가있는 구조가 보이지 않습니다.

$data = "12.1 0 1144713  751 17 Y 8 517 526 537 542 550 556 561 567          17 "; 

$arr = preg_split("/ +/", $data); 
print_r($arr); 

Array 
(
    [0] => 12.1 
    [1] => 0 
    [2] => 1144713 
    [3] => 751 
    [4] => 17 
    [5] => Y 
    [6] => 8 
    [7] => 517 
    [8] => 526 
    [9] => 537 
    [10] => 542 
    [11] => 550 
    [12] => 556 
    [13] => 561 
    [14] => 567 
    [15] => 17 
    [16] => 
) 

0 개 이상의 공백으로 라인을 분할이 preg_split("/ +/", $data); 시도는, 당신은 당신이 처리 할 수있는 멋진 배열이있을 것이다. 그러나 데이터를 살펴보면 구조가 없으므로 어떤 배열 요소가 어떤 데이터에 해당하는지 알 필요가 있습니다.

행운을 빈다.

+0

안녕하세요 - 이것은 내 첫 번째 생각이었습니다. 그리고 구현하기 시작했으나 이것을 "구분 된 열"로 간주합니다. 이는 null 레코드가있을 수 있다는 것을 의미하며 이것을 수행하면 그 기록들. 나는 그것이 진행되고있는 것을 다소 설명했던 PDF를 발견했다. 그것은 필드 길이를 포함했다.그 필드 길이를 사용하여 나는 substr ($ row, $ column-position, $ field-length) – Roi

+0

과 같은 행운을 빌 수있다. 이 종류의 데이터를 구문 분석하는 것은 매우 어렵습니다. – DarthVader

1

excel로 열고 쉼표로 구분하여 저장하십시오. 연속 된 구분자를 하나로 처리하거나하지 마십시오. 그런 다음 CSV로 다시 저장하십시오. CSV는 쉼표로 구분되어 mysql로 ​​가져 오기가 더 쉽습니다.

편집 : "[+]"에 preg_split을 사용하는 사람은 본질적으로 내가 위에서 한 것과 같은 대답을 제공합니다.

질문은 그 다음에해야 할 일입니다.

아직 "행 유형"이 몇 개인 지 결정 했습니까? 일단 당신이 그것의 특성을 결정하고 특성을 정의했다면 그것을 통과하는 코드를 작성하는 것이 훨씬 쉬울 것입니다.

csv로 저장하면 PHP fgetcsv 함수 및 관련 함수를 사용할 수 있습니다. 각 행에 대해 유형을 확인하고 유형에 따라 조작을 수행합니다.

첫 번째 열의 데이터에 "."가 포함되어 있는지 여부에 따라 데이터 행을 나눌 수 있습니다. 여기에 파일을 반복하는 방법의 예가 있습니다.

동안 ($ 행 = fgetcsv ($ file_handle)) { (strpos ($ 행 [0], '.') === 거짓) { // // 할 다른 { } 뭔가 을 할 경우 뭔가 다른 } }

확인 "table INTO INSERT", 여기에 좀 더 관찰의 "표 table_$row[0] 만들기"같은 수 또는 것 "뭔가 할"

귀하의 파일입니다 아르 자형 여러 파일을 함께 붙인 것처럼 여러 형식이 포함되어 있습니다."4"로 시작하는 모든 행은 4 자리로 된 회사 약어와 완전한 회사 이름을가집니다. 그 중 하나는 "caco"입니다. "caco"를 검색하면 파일 내의 여러 "표"에서 찾을 수 있습니다.

또한 "smuwtfa"(요일)가 주위에 뿌려졌습니다.

이와 같은 단서를 사용하여 각 행을 처리하는 방법의 논리를 결정하십시오.

+1

파일을 자세히 살펴보면 CSV로 변환하는 것이 간단하지 않다는 것을 알 수 있습니다. 여기에 포함 된 데이터는 그보다 훨씬 더 복잡합니다. 리버스 엔지니어링, 파싱을 수행하고 여러 테이블로 가져와야합니다. –

+0

데이터 구조가 무엇인지 알기가 어렵습니다. 디코딩 할 구조의 요약을 실제로 게시 한 경우 더 유용합니다. –

+0

나는 substr을 사용하고 섹션 당 형식을 따르는 것을 할 수있는 것처럼 보였다. – Roi

2

이 파일 구조를 사용하면 기본적으로 독점 형식을 리버스 엔지니어링해야합니다. 그렇습니다. 공백으로 구분되지만 형식은 CSV, YAML 등과 같은 표준을 따르지 않습니다. 헤더와 자체 섹션의 머리글로 보이는 부분이 완전히 독점적입니다.

나는 Excel 또는 XML과 같은 작업을 수행 할 수있는 다른 유형의 내보내기가 있는지보고자 시도하는 것이 가장 좋습니다. 화면이 긁힐 수있는 일종의 html 출력이 있는지 확인한 다음 Excel에 붙여 넣어 얻은 결과를 확인하십시오.

위에서 언급 한 모든 것 때문에 현재 형식의 파일을 데이터베이스로 현명하게 가져올 수 있습니다. 파일 구조에서 많은 테이블이 필요할 것입니다.

관련 문제