Languages/Java

CSV File 읽어오기. File, BufferedReader

반응형

경마게임 코드를 작성하다가 저장된 데이터를 불러오는 기능이 있어야만 한다는 걸 깨닫게 되었다. 

매번 유저정보 말정보 새로 입력할 수 없어.. 너무 번거로워...

 

처음엔 sharedPreference에 대해 좀 알아봤는데 이건 안드로이드 스튜디오에서 사용하는 기능인 것 같아서 일단 패스.. 무엇보다 꽤 오래 서칭했는데도 내가 사용하기에 적절한 레퍼런스를 찾지 못했다. 

 

그러고서 Mysql이니 JQuery니 하는 것들 속에서 헤매다가.. 개발자 언니가 던져준 "텍스트 파일에 CSV로 저장하고 읽어"에서 실마리를 찾게 되었다. 이건 그래도 검색해보니 뭔가 내가 쓸 수 있을 것 같았음

 

 

1. 활용한 코드 부분 (201003ver)

		User u = new User();
		MyHorse h = new MyHorse();
		ManageGame mg = new ManageGame();
		
		//Scanner sc = new Scanner(new File("C:\\lecture\\hgdata\\userdata.csv"));
		String line = "";
		String splitBy = ",";
		
		String[] horseInfo = new String[3];
		Double[] skill = new Double[4];
		int[] status = new int[3];
		int[] basicinfo = new int[3];
		
		try {
			BufferedReader br = new BufferedReader(new FileReader("userdata.csv"));
			while((line = br.readLine())!= null) {
				String[] userdata = line.split(splitBy);
				//매핑해주기
				System.out.println(userdata);
				u.setUserInfo(userdata[0], userdata[1], userdata[2], userdata[3]);
				//user info mapping name email gender dob
				
				h.setHorseInfo(userdata[4], userdata[5], userdata[6]);
				//horse info mapping name kind color
				
				for(int i=0; i<4; i++) {
					skill[i] = Double.parseDouble(userdata[i+7]);
				}
				h.setSkill(skill[0], skill[1], skill[2], skill[3]);
				//horse skill mapping
				
				for(int i=0; i<3; i++) {
					status[i] = Integer.parseInt(userdata[i+11]);
				}
				h.setStatus(status[0], status[1], status[2]);
				//horse status mapping
				
				for(int i=0; i<3; i++) {
					basicinfo[i] = Integer.parseInt(userdata[i+14]);
					System.out.println(basicinfo[i]);
				} 
				mg.setBasicInfo(basicinfo[0], basicinfo[1], basicinfo[2]);
				//ManageGame day time gold mapping
			}
		}
			
		catch (IOException e){  
			e.printStackTrace();  
		}  
		
		u.showUserInfo();
		h.showMyHorseInfo();
		mg.showDate();

맵핑할 땐 가독성을 좋게 하려고 일부러 포문을 여러차례 써서 userinfo, horseinfo, skill, status, basicinfo를 나누어 받았다. 이게 사람 입장에선 보기 좋은게 맞는데 성능면에서 좋은건진 모르겠다.

 

 

2. 파일 읽어오는 부분만 따로 정리

		//Scanner sc = new Scanner(new File("C:\\lecture\\hgdata\\userdata.csv"));
        .
        .
        
		try {
			BufferedReader br = new BufferedReader(new FileReader("userdata.csv"));
			while((line = br.readLine())!= null) {
        .
        .

스캐너로 읽어와서 쓰는 방법과 버퍼드리더로 읽어와서 쓰는 방법 두 가지가 있었다. 나는 실습 개념으로 Scanner를 이용해서 읽어왔고, 맵핑할 땐 버퍼드리더로 써봤다. 사실 try {} 쓴 것도 뭔지 모르는데 그냥 따라 씀. 한번 찾아봐야겠다.

 

Scanner를 사용해서 new File();하는 경우 경로를 넣어준 레퍼런스 페이지를 보고 따라했다가

그 뒤에 BufferedReader을 사용한 레퍼런스 페이지를 보고 따라하면서 파일경로에 파일명만 넣어줬더니 경로가 꼬여서 오류가 났다. 대충 아래와 같은 오류 ▼ 

java.io.FileNotFoundException: userdat.csv (지정된 파일을 찾을 수 없습니다)
--- USER INFO ---
	at java.io.FileInputStream.open0(Native Method)
	at java.io.FileInputStream.open(Unknown Source)
	at java.io.FileInputStream.<init>(Unknown Source)
	at java.io.FileInputStream.<init>(Unknown Source)
	at java.io.FileReader.<init>(Unknown Source)
	at BreedingNRace.test.main(test.java:46)

파일명만 넣는 경우의 경로는 프로젝트 경로여야 한다. 

.project

.classpath 파일 있는 그 폴더

아니면 스캐너에서 썼던 것처럼 읽어올 파일이 있는 경로+파일명+확장자를 통째로 넣어줘야 하는 듯 

 

 

3. referenced page (감사합니다)

opencsv.sourceforge.net/#where_can_i_get_it

codechacha.com/ko/java-write-csv-file-with-opencsv/

fors.tistory.com/77

www.javatpoint.com/how-to-read-csv-file-in-java

728x90
반응형