NGMsoftware

NGMsoftware
로그인 회원가입
  • 매뉴얼
  • 학습
  • 매뉴얼

    학습


    C# C# .NET 매크로 프로그램 만들기. (CSV와 텍스트 파일을 엑셀 파일처럼 처리하는 방법)

    페이지 정보

    본문

    안녕하세요. 엔지엠소프트웨어입니다. 앞서 텍스트 파일과 엑셀 파일의 데이타를 어떻게 처리하는지 알아봤습니다. 전체 데이타를 변수로 처리할 수 있는 기능도 추가해야겠네요. 글을 작성하려다가 갑자기 생각이 났습니다. 포이치 반복이 아닌 변수에 배열로 데이타를 넣고, 사용자가 마음데로 가공해서 사용할 수 있도록 하는것도 괜찮을거 같아요.

     

    우선, 데이타라는건 텍스트 파일처럼 한줄에 하나씩 입력해서 처리할 수 있습니다. 하지만, 엑셀처럼 열과 행으로 된 데이타를 사용하고 싶을수도 있는데요. 그렇다고해서 매번 엑셀 파일을 만들어서 데이타를 입력하고 처리하는건 귀찮은 일일수도 있습니다. 그래서, 간단한 CSV파일을 이용하기도 합니다. 아래는 CSV 파일의 내용인데요. 간단한 형식만 지원하기 때문에 확장성은 많이 떨어집니다.

    0J9TMy6.jpeg

     

     

    만약, 데이타에 콤마가 있으면 CSV 파일로 처리하기는 쉽지 않습니다. 사람이 눈으로 확인하고, 열 구분이 어디까지인지 판단하는거랑 컴퓨터는 생각하는 메커니즘 자체가 다르니까요. 그래서, 다른 구분자(Separator)를 사용할 수 있는 선택지를 제공해야 할거 같아요. 그러면, 열을 구분하는 콤마 대신 다른 것들을 사용할 수 있거든요. 이렇게 되면 확장성이 대폭 향상되게 됩니다. 아래와 같이 구분자 속성을 하나 추가하면 될거 같네요.

    [LocalizedCategory("Action")]
    [LocalizedDisplayName("ColumnSeparator")]
    [LocalizedDescription("ColumnSeparator")]
    [Browsable(true)]
    [DefaultValue(null)]
    public char? ColumnSeparator { get; set; }

     

    파일을 처리하는 로직은 그렇게 복잡하지 않은데요. 이미 Csv 파일 처리 로직은 만들었기 때문에 구분자만 다르게하면 코드를 재사용할 수 있겠네요.

    case Definition.FileType.Txt:
        if (ColumnSeparator == null)
            _datas = File.ReadAllLines(SelectDataSource).ToList();
        else
        {
            if (TableDirection == Definition.TableDirection.CustomHeaderColumnRow || TableDirection == Definition.TableDirection.CustomHeaderRowColumn)
            {
                player.Manager.Output.WriteLine($"[{TableDirection.ToString()}] {player.Manager.Client.ResxMessage.GetString("NotSupportOption")}", log4net.Core.Level.Warn);
                return 0;
            }
    
            _datas = ExcelExt.Manager.ReadCsv(SelectDataSource, UseHeader, TableDirection, CustomColumns, ColumnSeparator);
        }

     

    기존의 텍스트 파일 처리 로직에서 구분자를 추가하여 처리할 수 있도록 해야 합니다. 텍스트 파일과 CSV 처리 로직은 거의 동일합니다. 구분자만 다를뿐이예요.

    public static List<string?> ReadCsv(string path, bool useHeader, Ai.Definition.TableDirection tableDirection, string[]? headers, char? separator = null)
    {
        if (separator == null)
            separator = ',';
    
        var result = new List<string?>();
    
        var rows = File.ReadAllLines(path);
    
        switch (tableDirection)
        {
            case Definition.TableDirection.ColumnRow:
                foreach (var row in rows)
                    result.AddRange(row.Split(separator.Value));
                break;
            case Definition.TableDirection.RowColumn:
                for (int i = 0; i < rows.First().Split(separator.Value).Length; i++)
                {
                    foreach (var row in rows)
                        result.Add(row.Split(separator.Value)[i]);
                }
                break;
        }
    
        return result;
    }

     

    완성된 기능을 테스트 해볼까요? 스크립트 구조는 아래와 같습니다. 여기서, CSV 파일을 선택하면 됩니다.

    x5A1rI3.jpeg

     

     

    아래 동영상을 참고하셔서 CSV와 텍스트 파일을 테스트 해보세요.

     

     

    이렇게해서 내용 반복기인 포이치 반복 액션에 대해 모두 알아봤습니다. 여기에서 추가해야 할 기능이 있을지는 모르겠지만, 텍스트 파일을 저장할 때 확장자를 ini나 bin등등... 어떤 시스템 확장자를 사용해도 됩니다. 다만, 정상적으로 읽어오려면 텍스트 파일로 작성한 내용이어야 합니다. 바이너리와 같이 어떤 처리가 된 경우에는 해당 프로그램에서만 사용 가능하기 때문에 정상적으로 값을 가져올 수 없어요^^

     

    개발자에게 후원하기

    MGtdv7r.png

     

    추천, 구독, 홍보 꼭~ 부탁드립니다.

    여러분의 후원이 빠른 귀농을 가능하게 해줍니다~ 답답한 도시를 벗어나 귀농하고 싶은 개발자~

    감사합니다~

    • 네이버 공유하기
    • 페이스북 공유하기
    • 트위터 공유하기
    • 카카오스토리 공유하기
    추천0 비추천0

    댓글목록

    등록된 댓글이 없습니다.