iOS의 건강 관리 데이터를 CSV로 변환

6591 단어 GoAppleWatchiOS
iOS(아이폰) 및 Apple Watch에 저장된 보건 데이터
재활용을 위해 데이터를 출력했지만 xml 형식으로는 사용하기 어려워서 CSV로 변환해 봤습니다.
github 저장소

우리측 환경

  • iPhone7 iOS 12.2
  • Apple Watch gen3(감각은)
  • 방법

  • iPhone의 Health 응용 프로그램에서 Export Health Darta 을 선택하여 zip 파일을 내보냅니다.

  • 조금 있으면 파일을 어떻게 하느냐는 질문을 받을 수 있기 때문에 임의의 방법으로 컴퓨터에 보낸다
    우리는 맥에서 iCloud를 사용하여 데스크톱에 협력합니다.

  • zip 파일 압축 풀기
  • ZIP 파일의 압축을 풀면 디렉토리는 다음과 같이 구성됩니다.
  •     .
         ├── README.md
         ├── apple_health_export
         │   ├── export.xml
         │   └── export_cda.xml
    
  • export_cda.xml 내용을 잘 몰라서 무시합니다.
  • 다음은 편집용 프로그램입니다.
  • package main
    
    import (
        "encoding/xml"
        "io/ioutil"
        "log"
        "os"
    
        "github.com/gocarina/gocsv"
    )
    
    type HealthData struct {
        XMLName xml.Name `xml:"HealthData"`
        Record  []Record
    }
    
    type Record struct {
        Type          string `xml:"type,attr" csv:"type"`
        SourceName    string `xml:"sourceName,attr" csv:"-"`
        SourceVersion string `xml:"sourceVersion,attr" csv:"-"`
        Unit          string `xml:"unit,attr" csv:"unit"`
        CreationDate  string `xml:"creationDate,attr" csv:"-"`
        StartDate     string `xml:"startDate,attr" csv:"startDate"`
        EndDate       string `xml:"endDate,attr" csv:"endDate"`
        Value         string `xml:"value,attr" csv:"value"`
    }
    
    func main() {
    
        // open xml file.
        xmlFile, err := os.Open("./apple_health_export/export.xml")
        if err != nil {
            log.Fatal(err)
        }
        defer xmlFile.Close()
    
        // read xml data.
        xmlData, err := ioutil.ReadAll(xmlFile)
        if err != nil {
            log.Fatal(err)
        }
    
        // parse xml and export to csv.
        csvFile, err := os.Create("./export.csv")
        if err != nil {
            log.Fatal(err)
        }
        defer csvFile.Close()
    
        var healthData HealthData
        xml.Unmarshal(xmlData, &healthData)
        records := healthData.Record
        gocsv.MarshalFile(&records, csvFile)
    
    }
    

    득점


    HealthData에는 Record 데이터 구조로 여러 개의 데이터가 포함되어 있기 때문에
    HealthData 및 Record 구조가 준비되어 있습니다.
    Record 구조체에서 항목 추출 기술csv:"xxx"추출할 필요가 없는 항목을 csv:"-" 로 설정하면parser가 잘 처리됩니다.

    개선 사항

  • 메모리 사용량이 매우 많음
  • 파일 크기와 비례하여 메모리 사용량 증가
  • 마지막


    띄어쓰기지만 사용할 수 있는 데이터를 얻었기 때문에
    CSV로 뭔가 할 수 있는지 해보고 싶어요.

    좋은 웹페이지 즐겨찾기