Windows Phone 72011. 11. 16. 17:19

코레일의 역정보를 어디서 가져오나 싶었더니 sqllite를 이용하여 가져왔다.

나도 그것을 복사해서 해볼려고 했었지만 외부에서 가져온 sqllite 파일의 인코딩이 UTF8이 아니라 UTF16이여서

읽혀지지가 않았다.

그래서 어짜피 로컬 파일이니 그냥 csv로 만들어서 넣었다.

내가 한 작업은 이렇다.

1. sqlLite Database Browser에서 아이폰소스에서 가져온 KorailDatabase.sqlite 파일을 로드 한다.

2. file - export-에서  csv 파일로 export한다.

3. 메모장으로 아까 저장한 csv 파일을 다른이름으로 저장하는데 인코딩을 UTF8로 다시 저장한다.

4. 이제 윈폰7에서 정상적으로 한글로 보이고 파싱한다.
 

만약 나중에 역이 업데이트 되었을때 아이폰소스에서 저 파일만 다시 받아서 저렇게 csv파일로 만들어서 윈폰에 넣으면 된다.

아래는 csv를 List로 만든 소스이다.

 

    private List<StationsModel> GetStationsList()
    {
        var resource = Application.GetResourceStream(new Uri(@"/GloryApp;component/Resources/KorailStations.csv", UriKind.Relative));

        StreamReader streamReader = new StreamReader(resource.Stream);
        string stations = streamReader.ReadToEnd();

        var StationsSplitData = stations.Split('\n');

        List<StationsModel> stationLists = new List<StationsModel>();

        foreach (var item in SkipData.First(StationsSplitData))
        {
            if (item == "")
                continue;

            var splitString = item.Split(',');

            stationLists.Add(new StationsModel()
            {
                code = splitString[0].Replace("\"", ""),
                lat = splitString[1].Replace("\"", ""),
                lng = splitString[2].Replace("\"", ""),
                title = splitString[3].Replace("\"", ""),
                ktx = splitString[4].Replace("\"", ""),
                indexgroup = splitString[5].Replace("\"", ""),
                maingroup = splitString[6].Replace("\"", "")
            });
        }

        return stationLists;
    }
}
Posted by 동동(이재동)
Windows Phone 72011. 11. 16. 16:14

CSV파일을 윈폰에서 읽을때 첫줄을 Skip 하고 싶을때 사용한다.

csv 첫줄에는 대부분 데이터들의 컬럼값 즉 메뉴 이름같은것이 들어가기때문에

첫줄을 제외한 나머지 데이터를 뽑을때 유용한다. 혹은 마지막데이터를 끊거나

풀 소스

/// <summary>
/// csv 파일을 읽을때 처음 한줄을 Skip 할때 사용
/// foreach문등에서 처음 인덱스와 끝의 인덱스를 감지 한다.
/// </summary>
public static class SkipData
{
    public class SkipFirst<T> : IEnumerable<T>
    {
        private IEnumerable<T> mEnum;

        public SkipFirst(IEnumerable<T> enm)
        {
            mEnum = enm;
        }

        #region IEnumerable<T> Members

        public IEnumerator<T> GetEnumerator()
        {
            IEnumerator<T> iter = mEnum.GetEnumerator();
            if (iter.MoveNext())
            {
                while (iter.MoveNext())
                {
                    yield return iter.Current;
                }
            }
        }

        #endregion IEnumerable<T> Members

        #region IEnumerable Members

        System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
        {
            return GetEnumerator();
        }

        #endregion IEnumerable Members
    }

    public class SkipLast<T> : IEnumerable<T>
    {
        private IEnumerable<T> mEnum;

        public SkipLast(IEnumerable<T> enm)
        {
            mEnum = enm;
        }

        #region IEnumerable<T> Members

        public IEnumerator<T> GetEnumerator()
        {
            IEnumerator<T> iter = mEnum.GetEnumerator();
            if (iter.MoveNext())
            {
                T curr = iter.Current;
                while (iter.MoveNext())
                {
                    yield return curr;
                    curr = iter.Current;
                }
            }
        }

        #endregion IEnumerable<T> Members

        #region IEnumerable Members

        System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
        {
            return GetEnumerator();
        }

        #endregion IEnumerable Members
    }

    static public SkipFirst<T> First<T>(IEnumerable<T> enm)
    {
        return new SkipFirst<T>(enm);
    }

    static public SkipLast<T> Last<T>(IEnumerable<T> enm)
    {
        return new SkipLast<T>(enm);
    }
}

참고 : http://honestillusion.com/blogs/blog_0/archive/2007/02/05/c-code-adding-skip-first-to-foreach.aspx

참고로 사용은 이렇게 한다.


foreach (var item in SkipData.First(StationsSplitData))
Posted by 동동(이재동)