본문 바로가기

C# 윈도우 프로그래밍

C# 프로그래밍 json / xml / 텍스트 파일 저장하기

json / xml에 대해 잘 모르는 사람이 있다면 전에 글을 참고하시기 바랍니다.

https://easytocoding.tistory.com/30

 

파이썬 프로그래밍 Json / XML 제어 하기

이번 본문에서는 파이썬 프로그래밍 에서 파일저장부분을 설명할건데 가장 유명한 json 파일 형식과 xml 파일 형식 두가지를 알아볼것이다. json 파일 JSON은 2009년에 더글라스 크록포드(Douglas Crockfo

easytocoding.tistory.com

텍스트 파일이야 다들 잘 아실테니 사용법에 대해서만 밑에 기술하겠습니다.

 

실제 산업현장에서는 어차피 텍스트파일을 오류가 날 경우도 많고 데이터가 많아지면 처리하기도 어려워 잘 안쓰게 되서 다 json이나 xml을 쓰는 추세이긴 합니다. 간단하면 차라리 레지스트리에 저장해 버리지...

 

그래도 테스트할때는 입출력이 간단해서 텍스트파일을 쓰기도 하니 간단하게 어떻게 사용하는지 알려드리도록 하겠습니다.

 

 

 

텍스트 파일 (.txt / .dat)

 

단순히 using System.IO를 추가 하면서 쓸수있어서 아주 편하다.

읽는데 여러함수가 있는데 File.ReadallLines() 함수를 쓰면 다 가져오므로 가져와서 처리하는게 편하다

 

다른 함수는 그냥 찾아보도록 안그래도 텍스트파일을 잘 쓰지도 않는데 다른 함수까지는 아에 안쓴다고 보면 편하다.

위에 보이는 것처럼 ReadAllLines함수로 읽는데 path에 아래처럼 경로하나 해주고 꼭 @<<문자를 앞에 추가해준다. 경로읽는데 문제생길 소지를 없애준다.

string path=@"c:\test.txt";
 

읽어드린 문자열들을 foreach 반복문으로 줄 마다 읽어서 리스트박스에 추가해줘서 나타내는 코드이다.

 

더이상 읽어드릴 줄이 없으면 반복문이 끝난다.

 

물론 위에 코드가 들어갈려면 디자이너 쪽에 ListBox가 listBox1이라는 이름으로 추가되어있어야 된다.

 

이번에는 파일에 쓰는데 이때에는 StreamWriter()함수를 쓰는데

위에 코드 처럼 path를 읽은 다음 foreach반복문에서 더이상 내용이 없을때까지 WriteLine()함수로 한줄씩 써내려간다.

매번 새로 쓰지않게 뒤에다가 쓸때는 밑에 보이는 함수 WriteAdd()에서 true옵션을 준것처럼 옵션에서 true값을 준다. false를 쓰던가 아무것도 안쓰면 매번 파일을 새로 만든다. 꼭 주의 할것.

 

Json 파일

C# 프로그래밍에서는 json 파일을 읽고 불러오기 위해서 기존 API를 가져와서 쓰는게 편하다. (이 라이브러리가 어마어마하게 많은게 c#프로그래밍의 가장 큰 장점이다) 여러가지 라이브러리들이 있는데 제일 많이 쓰는 newtonsoft.json 라이브리를 사용하는걸 기준으로 한다.

 

Newtonsoft.json 라이브러리 설치는 c# 프로그래밍에서 nuget패키지로 설치 할수 있다.

비쥬얼 스튜디오에서 맨위에 도구=> nuget패키지 관리 => 솔루션용 nuget패키지 관리로 들어간다.

여기로 들어가면 nuget패키지 리스트가 뜨고 검색도 할수있게 창이 나오는데

json을 검색해도 되고 newton을 검색해도 되고 하여튼 아래와 같이 검색을 한다.

그 다음 오른쪽 하단에 나오는 설치 버튼을 눌러서 설치를 하게 되면

위와 같은 창이 뜨게 되는데 확인 눌르면 이제 설치가 된다.

설치가 완료되면 코드에서 Newtonsoft.Json 과 Newtonsoft.Json.Linq를 사용하게 아래와 같이 선언하고.

 

using Newtonsoft.Json;
using Newtonfot.Json.Linq;
 

불러올때는 아래와 같은 코드를 사용한다. json파일은 아래와 같이 파이썬 프로그래밍 쪽에서 동일한 saveparam.json파일을 사용한다.

{
  "M003": {
    "okcount": 0,
    "ngcount": 0,
    "ST20": [
      {
        "id": "1",
        "name": "hub_ja_top_nock",
        "rate": "80",
        "enable": true
      },
      {
        "id": "2",
        "name": "hub_ja_top_neck_scratch",
        "rate": "80",
        "enable": true
      },
      {
        "id": "3",
        "name": "hub_ja_top_bolthole_no",
        "rate": "80",
        "enable": true
      }
    ]
  }
}
 

Json 파일 불러오기

 

json 파일 저장

코드를 살펴 보자면 , File.ReadAllText()함수로 Json 파일을 불러와서 Jobject.Parse()함수로 Jobject형식으로 변환을 실행하고 이걸 Jobject변수에 저장한다.

 

위에 코드에서는 그 읽어본 파일에서 첫번째 modelname이 일치하는것을 찾는데 없으면 메세지박스로 없다고 출력하고 끝내고, modelname이 있으면, ok 카운터 갯수와 ng카운터 갯수를 따로 저장한다음. 그아래 목록들을 리스트뷰에 저장한다.

 

위의 코드들은 windowsForms앱으로 만들어졌기때문에 항상 GUI(그래픽 유저 인터페이스)쪽에 반영하려면 invoke함수를 써줘서 반영해야 된다 안그러면 실제 화면에 반영 될떄가 있고 안될때가 있다. BeginInvoke() 함수로 Json 파일에서 읽어 드린 데이터를 실제 화면에 뿌려주면 위의 코드는 끝난다.

 

이번에는 json 파일에 쓸때는,

 

Json 파일 저장

 
 
 
 

json 파일 쓰기

위의 코드처럼 Jobject 변수로 json파일의 name/value 컬렉션과 array를 잘 맞쳐줘서 저장하면 된다. 위의 코드는

int okcount;
int ngcount;
ListView l1=new ListView();
 

위 3개가 있다는 가정하에 이루어진 코드이다.

 

for 반복문으로 리스트뷰에 있는 내용들을 name /value 컬렉션으로 다 저장하고 array구조를 만들면서 저장한다.

 

이때, JsonConvert.SerializeObject()함수를 꼭써서 저장해야 우리가 맨날 json파일 열어볼때처럼 줄띄여쓰기 이런게 다 되어서 저장된다 이거 안하면 코드로 읽고쓰는데는 상관없는데 한줄로 쭉나와서 json파일을 그냥 열어볼때는 보기가 참 난감하다.

 

Json 파일은 꼭 저장할때 수정이 안되고 삭제 후 추가라. 기존 데이터가 있으면 가지고 있다가 삭제하고 다시 붙여넣어야된다. 그래서 아랫단으로 내려갈수록 코드가 복잡해지긴 한다.

 

그다음에 이제 알아 볼것은

 

 

xml 파일

 

역시 xml파일에 대한 설명자체는 이글 맨위에 있는 링크 파이썬 프로그래밍 쪽에 json / xml 쓰여진 곳 참고하면 되고.

 

바로 본론으로 c# 프로그래밍에서 어떻게 다루는지 알아보도록 하자.

 

xml 파일은 c# 프로그래밍 에서 Json 파일과 다르게 외부 라이브러리가 필요가 없다. 기본적으로 내장된 라이브러리를 선언만 하고 쓰면 된다.

 

using System.Xml;
 

위와 같이 선언만하고 이제 사용할 준비가 된거다. 텍스트 파일처럼 선언만 하면 되서 편하고 가볍다.

 

읽고 쓰는것은 트리구조라서 Json과 매우 흡사하다 함수가 JObject.parse()가 XmlDocument()함수로 바뀌고 JObject가 XmlNode 변수로 바뀐다고 생각하면 된다.

 

이제 읽는건 아래 코드처럼 구현한다.

 

xml 파일 읽기

위에 코드는 imglab이라는 파이썬에서 그림에 마스킹하는 프로그램의 저장파일을 c# 프로그램에서 읽어오는 것인데. 이때 문제점이 imglab을 리눅스에서 하다보니 경로가 "/"로 되있는걸 윈도우의 "\"로 사전 작업하는것도 필요하다. 그 때 쓰이는 함수가 Value.Replace()함수를 써서 바꾸면 된다.

 

Json 파일에서 설명할때랑 비슷하게 다른건 별로 없고 트리구조로 이루어져 있기때문에 node단위로 식물에서 줄기를 타고 내려가듯 하나씩 타고 내려가면서 값을 가져와서 리스트뷰에 뿌려준다 마찬가지로 windowsForms앱에서 하는것이기 때문에 BeginInvoke()함수는 꼭써줄것!!

 

SelectSingleNode()함수는 한단계씩 트리구조를 타고 가서 선택할수 있게 하고

 

Attribute()함수는 그 값들을 각각 따로 저장 및 읽을 수 있게 해준다.

 

xml을 쓰는 것은. 아래 코드 처럼 구현하면 되는데.

 

xml 파일 쓰기

xml 파일 저장

위의 코드를 설명하자면, 우선 파일이 있는지 없는지 File.Exist()함수로 검사를 한다. 있으면 수정하고 없으면 새로 만든다. 당연히 새로 만들때는 노드를 CreateElement()함수를 이용하여 쉽게 만들고. 속성은 CreateAttribute()함수를 사용해서 만든다. 이 트리구조를 만들때 주의해야 되는게 AppendChild()와 Append()함수를 잘 구별해서 써서 써야지 안그러면 트리 구조가 꼬인다.

 

팁이라면 이 트리구조는 코드로만 짜면 머리 아프므로 한번 그려놓고 코드로 짜는걸 추천한다. 그림으로 그려놓고 나면 매우 편하게 코딩을 진행할 수 있다.

 

xml은 수정할때 json처럼 다 수정해서 붙여넣을 필요는없다 각각 따로따로 수정해서 값을 변경해도 된다. 위에 코드는 그냥 수정해서 새로 쓰는게 편하므로 그냥 쓰는거다 기존에 바뀐값이 무엇인지 안바뀐값이 무엇인지 체크하는 시간이 더 걸리므로 ..

 

항상 코딩할때 어떤게 시간이 빠를지 보고 코딩하는게 중요하다. 제일 빠른 방법으로 해야지 프로그램이 덜 무거워진다.

 

특히 c# 프로그래밍 에서는 CPU부하가 생각보다 많아서 컴퓨터 자원을 많이 먹으므로, 실제 현장에서는 컴퓨터사양을 굉장히 고성능으로 한다 안그러면 랙걸리는 현상이 발생하여 처리가 가끔가다 느려지는 현상이 빈번하게 발생하기 때문이다. 거기다가 코드 자체도 느리게 하면 매우 느려서 산업현장에서는 못쓰는 경우도 수두룩하다.

 

꼭 주의하자.

 

 

 

반응형