Going my way

いいなと思ったことをメモしていきます。

javaでCSVファイルを読み込み、形を変えてCSVで出力するプログラムを作った


Advertisements


新人の時、「夜間に動くバッチで、CSV形式のファイルを読み込んで、ちょっと形を変えてCSVにして出力するJavaプログラムを作成せよ」的な司令が下った。
あの時はあの時で色々苦労したような気がする。

具体的にどんなだったか全然覚えてないんだけれど、とりあえずCSVtoCSV的な、ファイルを読み込んでちょっと整形してまた出力するJavaプログラムを作ってみた。

ちなみにCSVとは、Comma Separated Valuesの略で、カンマで区切ったデータを並べたファイルである。

■input.csv
以下のようなinput.csvを作った。

maeda,oshima,sashihara,shinoda
kojima,takahashi,kuramochi
maebara,maeda,nakata,Takajo

このCSVファイルを読んでいって、「sashihara」という文字列があったら、
これを「sashiko」に変換してoutput.csvに出力するプログラムを書いてみる。

■CSV2CSVクラス
上にあるinput.csvを読み込んで、変換してまたcsvにするプログラム。
ちょっといじればタブ区切りとか、スペース区切りにして出力もできます。

package csv2csv;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class CSV2CSV {
	private final static String inputCsvFile = "C:\\temp\\input.csv";
	private final static String outputCsvFile = "C:\\temp\\output.csv";
	private final static String ChangeName = "sashihara";
	private final static String ChangedName = "sashiko";
	
	public static void main(String[] args){
		String line;
		String[] csvArray;
		File inputFile = new File(inputCsvFile);
		File outputFile = new File(outputCsvFile);
		BufferedReader in = null;
		BufferedWriter out = null;
		try {
			in = new BufferedReader(new FileReader(inputFile));
			out = new BufferedWriter(new FileWriter(outputFile));
			
			/** 1行ずつ読み込んで整形する */
			while ((line = in.readLine()) != null){
				
				//区切り文字カンマ[,]で、区切られた文字列を配列に格納する
				csvArray = line.split("\\,");
				
				//配列の長さ分、データを出力していく
				for(int i=0; i < csvArray.length; i++){
					
					//行の最後のデータはカンマ付けない
					if(i != csvArray.length -1 ){
						if(ChangeName.equals(csvArray[i])){
							//[sashihara]は[sashiko]に変換して出力する
							csvArray[i] = ChangedName;
							out.write(csvArray[i]);
							out.write(",");
						}else{
							out.write(csvArray[i]);
							out.write(",");
						}
					} else{
						out.write(csvArray[i]);
					}
				}
				//newLineは改行する合図
				out.newLine();
			}
			
		}catch(FileNotFoundException e){
			e.printStackTrace();
		}catch(IOException e){
			e.printStackTrace();
		}finally{
			//fanallyは絶対実行される。とりあえずファイルは閉じるように。
			try{
				if (in != null){
					in.close();
				}
				if(out != null){
					out.close();
				}
			}catch(IOException e){
				System.out.println("close fail");
				e.printStackTrace();
			}
		}
		
	}
	
}

■output.csv
「sashihara」を「sashiko」に変換して出力した結果。

maeda,oshima,sashiko,shinoda
kojima,takahashi,kuramochi
maebara,maeda,nakata,Takajo

このように、指原がさしこになって出力されています。

いま書くと30分くらいで書ける処理も新人のときは泣きそうになりながらgoogleで答えを探して、でもなんだかよくわからなくて、路頭に迷ってた気がする(笑)

以下、新人の時の自分へ。

君はいつもググってばかりいるけど、一向に仕事が進まないね。
googleはたしかに便利だ。
どんな情報も手に入るかのように錯覚してしまいそうだ。

でも、googleは断片的な情報を与えてくれるけど、体系的な知識はなかなか与えてくれない。

体系的に学んでいないことは理解できないし、いま君が陥っているように答えを探すにもすごく時間がかかってしまう。

逆に、一回体系的に学べば、だいたいのことは調べながらできるし、検索の速度もめちゃくちゃ速くなる。

googleはあくまで補助に使うもので、基礎となるのは普段の勉強なんだ。

君は家でよく勉強しているけど、コードは読むだけじゃ身につかない。
書いて動かそう。君がバスケでずっと基礎練習を繰り返してきたように、繰り返し繰り返し反復して技術を磨くしかないんだ。

君は「10日でわかる~」とか「かんたん~」とか、「はじめての~」とかそんな本ばかり買っているけど、簡単そうに見える本に限って中身が薄くて実はあまり理解できないものなんだ。
最初は薄くてわかりやすそうな本を使うのは受験では鉄則だったけど、プログラミングでは少し厚くて詳しく書いてある本を使おう。

君の検討を祈る。
P.S.
試験なんてクソ食らえと思ってたけど、Javaの基礎勉強にはこれがすごく役に立ったよ。読んでみるといい。