[RESOLVIDO]Validação de dados!

Boa Tarde pessoal.

Estou com uma duvida que eu julgo simples.

preciso validar uma planilha… preciso sabe como faço para validar apenas as linhas que possuem APENAS um underline ("_").
eu fiz assim mas esta bem errado

List<String> filesList = null; for (int i = 0; i < FILE_NAMES.length; i++) { curr = FILE_NAMES[i]; if (curr != null && curr.contains("_")) { if (curr.contains("_R")) { curr = curr.substring(0, curr.indexOf("_R"));

Não entendi muito bem.
Pergunta, você precisa validar o nome do planilha ou o conteúdo da planilha?
Pode explicar melhor como deve ser a validação do underline?


Adriano de Souza Barbosa
http://hpesca.com.br

Cara,

Assim eu preciso validar cada celula da planilha… nenhuma pode conter mais do que 1 underline… se tiver 2 underlines ele vai dar erro…

exemplo

ABC_1
ABCD_2
ABCDE__3 < erro pq tem 2 underlines!

Tem de ter exatamente 1 underline?

Sim… nao pode ter mais que 1 … (:

Veja se a Apache Commons Lang se te ajuda.
Algo como:
StringUtils.countMatches(curr, “_”);

Leia em http://commons.apache.org/lang/api-2.5/org/apache/commons/lang/StringUtils.html#countMatches%28java.lang.String,%20java.lang.String%29 ou http://commons.apache.org/lang/api-2.5/org/apache/commons/lang/StringUtils.html

Ou vc pode fazer um split("_") de curr e contar o resultado, se for igual a 1, é o que vc espera.


Adriano de Souza Barbosa
http://hpesca.com.br

[quote=dante2202]Cara,

Assim eu preciso validar cada celula da planilha… nenhuma pode conter mais do que 1 underline… se tiver 2 underlines ele vai dar erro…

exemplo

ABC_1
ABCD_2
ABCDE__3 < erro pq tem 2 underlines![/quote]

Humm?? Seria algo mais ou menos assim:

[code]List filesList = new ArrayList();
filesList.add(0,“ABC_1”);
filesList.add(1,“ABCD_2”);
filesList.add(2,“ABCDE__3”);

	for (int i = 0; i < filesList.size(); i++)
	{
		int contador = 0;
		
		for(int a=0;a < filesList.get(i).length();a++)
		{
			if(filesList.get(i).substring(a,a+1).equals("_"))
			{
				contador +=1;
			}			
		}
		
		if(contador>1)
		{
			System.out.println(filesList.get(i)+"< ERRO: Pois tem "+contador+" underlines!");
		}else
		 {	
			System.out.println(filesList.get(i));
		 }
	}[/code]

?.. E fazendo a validação quando identificar que tem mais de um underline.

Ja tentei de todas as formas mas nada…

preciso que ele leia todas as linhas da planilha… e verifique em cada uma delas se o conteudo tenha mais que um underline

[code]public class CheckInfo {

private static final Logger log = Logger.getLogger(CheckInfo.class
		.getSimpleName());

private static String[] FILE_NAMES = null;

/**
 * @param args
 * @throws IOException
 * @throws BiffException
 */

public static void main(String[] args) throws IOException {

	try {
		if (args != null) {

			System.out.println("args[1]: " + args[1]);

			String fileName = args[0];
			WorkbookSettings ws = new WorkbookSettings();
			ws.setEncoding("ISO-8859-1");

			// Carrega a planilha + Encoding (ISO-8859-1)

			Workbook workbook = Workbook
					.getWorkbook(new File(fileName), ws);

			String sheetName = args[1];

			Sheet sheet = workbook.getSheet(sheetName);
			if (sheetName != null && sheetName.equals(sheet.getName())) {

				System.out.println("Nome da aba : " + sheet.getName());
			}
			StringBuilder validationErrors = new StringBuilder();

			int rows = sheet.getRows();

			FILE_NAMES = new String[rows];
			for (int i = 1; i < rows; i++) {
				
				Cell sheetFileName = sheet.getCell(0, i);

				
				
				if (sheetFileName.getContents() != null
						&& sheetFileName.getContents().length() > 0){
					
					FILE_NAMES[i - 1] = sheetFileName.getContents();

			}

			Map<String, List<String>> mapFiles = extractMapRevisions();

			checkFileNames(validationErrors, mapFiles);

			String dirGravacao = args[2];

			log.log(Level.INFO, "Gerando arquivo de validacao");

			// Grava log, arquivo validation.txt

			FileUtils.writeStringToFile(new File(dirGravacao
					+ File.separatorChar + "validation.txt"),
					validationErrors.toString());

			log.log(Level.INFO, "Arquivo de validacao gerado com sucesso.");
		}}
	} catch (IOException e) {
		log.log(Level.SEVERE,
				"Erro ao gerar o arquivo de log: " + e.getMessage());
	} catch (BiffException e) {
		log.log(Level.SEVERE,
				"Erro ao ler planilha excel: " + e.getMessage());

	}

}

/**
 * Ordena os arquivos para verificao
 * 
 * @return Map
 */
private static Map<String, List<String>> extractMapRevisions() {
	
	Map<String, List<String>> mapFiles = new HashMap<String, List<String>>();

	String curr = null;

	List<String> filesList = null;
	for (int i = 0; i < FILE_NAMES.length; i++) {
		curr = FILE_NAMES[i];
		
		if (curr != null && curr.contains("_R")) 
			 {
	
				
					curr = curr.substring(0, curr.indexOf("_R"));
					
					if (FILE_NAMES[i].contains("R000")) {
						filesList = new ArrayList<String>();
						mapFiles.put(curr, filesList);
						
					}
					filesList.add(curr);
				}else
					System.out.println("O arquivo possui mais de um underline!");
			
		

	
	
	
	}
	return mapFiles;
	}

/**
 * Verifica o nome dos arquivos.
 * 
 * @param validationErrors
 * @param mapFiles
 */
private static void checkFileNames(StringBuilder validationErrors,
		Map<String, List<String>> mapFiles) {

	validationErrors.append("Validando nomes de arquivos.... \n\n");

	for (Entry<String, List<String>> entry : mapFiles.entrySet()) {
		validationErrors.append("Validando arquivo " + entry.getKey()
				+ "\n\n");

		List<String> fileNames = entry.getValue();
		if (fileNames.size() > 1) {
			for (int i = 1; i < fileNames.size(); i++) {
				String currFileName = fileNames.get(0);
				String fileName = fileNames.get(i);

				int distance = StringUtils.getLevenshteinDistance(
						currFileName, fileName);

				if (distance > 0) {
					validationErrors
							.append("Nome de arquivo diferente:\n - R000: "
									+ currFileName + " \n - R00" + i + ": "
									+ fileName + " \n");
					validationErrors
							.append("---------------------------------------------------------------------------------------------------\n\n");
				}

			}

		}

	}

}

}[/code]

Talvez seja problema de charset, dependendo da origem a planilha pode ter charset diferente (Windows*, ISO*, UTF* e outros).
Para teste, em cada linha faz isso:

if(StringUtils.IsAsciiPrintable(linha)){ //print OK } else { //print ERRO + linha }

Att.,
Adriano de Souza Barbosa
http://hpesca.com.br

eu axo q descobri um jeito

[code]private static Map<String, List> extractMapRevisions() {
Map<String, List> mapFiles = new HashMap<String, List>();

	String curr = null;

	List<String> filesList = null;
	for (int i = 0; i < FILE_NAMES.length; i++) {
		
		curr = FILE_NAMES[i];
		
		if (curr != null && curr.contains("_R")) {
			curr = curr.substring(0, curr.indexOf("_R"));
			int count = StringUtils.countMatches(FILE_NAMES[i], "_");
			System.out.println(count);
			if (FILE_NAMES[i].contains("R000") && count <2) {
				filesList = new ArrayList<String>();
				mapFiles.put(curr, filesList);
			}
			filesList.add(curr);
		}
	}
	return mapFiles;
}[/code]

só que ele só pega as primeiras linhas… as linhas la pra baixo da planilha ele ta aceitando com mais de 1 underline!

Problema resolvido!

Obrigado a todos pelas respostas.
Segue:

[code]private static Map<String, List> extractMapRevisions() {
Map<String, List> mapFiles = new HashMap<String, List>();

	String curr = null;

	List<String> filesList = new ArrayList<String>();
	for (int i = 0; i < FILE_NAMES.length; i++) {
		curr = FILE_NAMES[i];

		if (curr != null && curr.contains("_R")) {

			curr = curr.substring(0, curr.indexOf("_R"));

			int count = StringUtils.countMatches(FILE_NAMES[i], "_");
			if (count == 1) {
				if (FILE_NAMES[i].contains("A000")) {
					mapFiles.put(curr, filesList);
				}
			} else {

				System.out.println("ERRO: Foram encontrados mais de um underline em : "+ FILE_NAMES[i]+"Favor Verificar" );
				
			}

			filesList.add(curr);

		}
	}
	return mapFiles;
}[/code]