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 … (:
[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]