폴더 안에 파일을 정리하듯 2중 리스트로 데이터 정리하는 방법
⭕ 코드 예제
함수 선언은 List<list< t="">> 형태다. (T는 string, char, int 등 자료형)
소문자 알파벳 리스트 데이터를 2중 리스트 안에 순서대로 대문자 알파벳 변환하여 저장하는 예제코드
List<List<char>> upperData = new List<List<char>>();
List<char> subData = new List<char>();
string dataLow = "a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z";
string[] calcLow = dataLow.Split(','); // 소문자 알파벳 string을 콤마로
// 구분하여 string[] 배열로 저장
Console.Write("subData : ");
for (int i = 0; i < calcLow.Length; i++)
{
char ch = calcLow[i][0]; // string[] 배열로 저장된 알파벳 char로 변환
subData.Add(ch); // List subData에 알파벳을 추가
// subData[26] 리스트가 만들어짐
Console.Write(subData[i] + " ");
}
Console.WriteLine("\r\n\r\n upperData ");
for (int i = 0; i < calcLow.Length; i++) // a~z 까지 알파벳 하나만 대문자로 바꾸어서
// 2중 리스트에 값을 저장하는 반복문
{
List<char> calcData = new List<char>(); // List의 값을 계산하기 위한 임시 List 생성
calcData.AddRange(subData); // 임시 List값에 소문자 알파벳 저장한 리스트 복사
calcData[i] = char.ToUpper(calcData[i]);// i 번째에 해당하는 소문자를 대문자로 변경
upperData.Add(calcData); // i 번째에 소문자를 대문자로 바꾼 List값을
// List<List> 2중 리스트에 전체 복사 upperData[0][26]
Console.Write("upperData[{0}] : ", i);
for (int j = 0; j < upperData[i].Count; j++)
{
Console.Write(upperData[i][j] + " ", i);
}
Console.WriteLine("");
}
1. List<List<char>> 타입의 upperData와 List<char> 타입의 subData를 선언 및 초기화한다.
2. string 타입의 dataLow 변수에 소문자 알파벳 문자열을 저장한다. string[] 타입의 calcLow 변수에 Split() 메서드를 이용하여 dataLow 문자열을 콤마로 구분하여 각 알파벳을 배열의 요소로 저장한다.
3. for 반복문을 이용하여 calcLow 배열의 요소 수만큼 반복한다. 각 요소마다 소문자 알파벳을 char 타입으로 변환하여 subData 리스트에 추가한다. subData 리스트의 각 요소를 출력한다.
4. for 반복문을 이용하여 calcLow 배열의 요소 수만큼 반복한다. List<char> 타입의 calcData 변수를 선언하여 subData 리스트의 값들을 복사한다. calcData 리스트에서 i번째 요소를 대문자로 변환한다. upperData 리스트에 calcData 리스트를 추가한다. upperData 리스트의 각 요소를 출력한다. 각 요소는 char 리스트 타입이므로 이중 반복문을
사용하여 출력한다.
🍺 출력 결과
subData : a b c d e f g h i j k l m n o p q r s t u v w x y z
upperData
upperData[0] : A b c d e f g h i j k l m n o p q r s t u v w x y z
upperData[1] : a B c d e f g h i j k l m n o p q r s t u v w x y z
upperData[2] : a b C d e f g h i j k l m n o p q r s t u v w x y z
upperData[3] : a b c D e f g h i j k l m n o p q r s t u v w x y z
upperData[4] : a b c d E f g h i j k l m n o p q r s t u v w x y z
upperData[5] : a b c d e F g h i j k l m n o p q r s t u v w x y z
upperData[6] : a b c d e f G h i j k l m n o p q r s t u v w x y z
upperData[7] : a b c d e f g H i j k l m n o p q r s t u v w x y z
upperData[8] : a b c d e f g h I j k l m n o p q r s t u v w x y z
upperData[9] : a b c d e f g h i J k l m n o p q r s t u v w x y z
upperData[10] : a b c d e f g h i j K l m n o p q r s t u v w x y z
upperData[11] : a b c d e f g h i j k L m n o p q r s t u v w x y z
upperData[12] : a b c d e f g h i j k l M n o p q r s t u v w x y z
upperData[13] : a b c d e f g h i j k l m N o p q r s t u v w x y z
upperData[14] : a b c d e f g h i j k l m n O p q r s t u v w x y z
upperData[15] : a b c d e f g h i j k l m n o P q r s t u v w x y z
upperData[16] : a b c d e f g h i j k l m n o p Q r s t u v w x y z
upperData[17] : a b c d e f g h i j k l m n o p q R s t u v w x y z
upperData[18] : a b c d e f g h i j k l m n o p q r S t u v w x y z
upperData[19] : a b c d e f g h i j k l m n o p q r s T u v w x y z
upperData[20] : a b c d e f g h i j k l m n o p q r s t U v w x y z
upperData[21] : a b c d e f g h i j k l m n o p q r s t u V w x y z
upperData[22] : a b c d e f g h i j k l m n o p q r s t u v W x y z
upperData[23] : a b c d e f g h i j k l m n o p q r s t u v w X y z
upperData[24] : a b c d e f g h i j k l m n o p q r s t u v w x Y z
upperData[25] : a b c d e f g h i j k l m n o p q r s t u v w x y Z
⭕ 사용한 코드 예제
날짜별로 데이터를 나누어 저장할 때 사용했다
using (FileStream fs = new FileStream(searchPath, FileMode.Open))
{
using (StreamReader sr = new StreamReader(fs, System.Text.Encoding.Default, false))
{
List<string> dateDay = new List<string>();
string lines = null;
List<string> datetp = new List<string>();
dateDay.Add(Path.GetFileName(searchPath));
trData.Add(dateDay); // 2중 List에 데이터 저장
while ((lines = sr.ReadLine()) != null)
{
if (string.IsNullOrEmpty(lines)) return;
datetp.Add(lines); // 파일마다 데이터들을 datetp List 안에 값 저장
}
dateDay.AddRange(datetp);
datetp.Clear();
}
}
위 코드는 파일 경로 searchPath에 있는 파일을 열어서, 각 파일의 이름과 파일 안의 데이터를 trData라는 2중 리스트에 저장하는 코드입니다.
먼저 FileStream과 StreamReader를 사용하여 searchPath의 파일을 열고, 파일 안의 각 라인을 읽어옵니다. 각 파일의 이름을 저장하기 위해 dateDay라는 List<string>을 생성하고, Path.GetFileName() 함수를 사용하여 파일 이름을 구하고 dateDay에 추가합니다. 그리고 trData에 dateDay를 추가하여 2중 리스트에 파일 이름을 저장합니다.
그리고 while문을 사용하여 파일 내의 모든 라인을 읽어옵니다. 만약 읽어온 라인이 null이거나 빈 문자열이라면 함수를 빠져나오게 됩니다. 그렇지 않다면, datetp라는 List<string>에 읽어온 라인을 추가합니다. 각 파일의 데이터들을 모두 datetp에 저장한 후, dateDay.AddRange(datetp)를 사용하여 파일 이름과 데이터를 함께 dateDay에 추가합니다. 그리고 datetp를 비워줍니다.
🍺 사용한 코드 출력 결과
날짜별로 데이터가 2중 리스트안에 저장하여 분류된 결과
🌲 생각
.csv 파일안에 각각의 데이터들을 정렬하거나 추출할 때 사용하니 편했다
'코딩 > C#' 카테고리의 다른 글
[C#] 엑셀처럼 정렬하기 나머지 행들을 같이 정렬하는 방법 (0) | 2023.04.02 |
---|---|
[C#] .csv 파일 읽기 쓰기 (0) | 2023.04.02 |
[C#] string 특정 문자 포함 합치기 [string.Join()] (0) | 2023.04.02 |
[C#] List 데이터 정렬 하는 방법 (0) | 2023.04.02 |
[C#] C#에서 전기자동차 충전소 정보 API를 활용하는 방법 (0) | 2023.04.01 |