[RESOLVIDO]Validação de dados!

10 respostas
D

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"));

10 Respostas

AdrianoSB

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

D

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!

E

Tem de ter exatamente 1 underline?

D

Sim… nao pode ter mais que 1 … (:

AdrianoSB

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

RicardoFranca
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!

Humm?? Seria algo mais ou menos assim:

List<String> filesList = new ArrayList<String>();
		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));
			 }
		}

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

D

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

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");
					}

				}

			}

		}

	}
}
AdrianoSB

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

D

eu axo q descobri um jeito

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"));
				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;
	}

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

D

Problema resolvido!

Obrigado a todos pelas respostas. Segue:
private static Map<String, List<String>> extractMapRevisions() {
		Map<String, List<String>> mapFiles = new HashMap<String, List<String>>();

		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;
	}
Criado 10 de dezembro de 2012
Ultima resposta 11 de dez. de 2012
Respostas 10
Participantes 4