Почему foreach l oop пропускает выполнение кода foreach, вложенного в него? - PullRequest
0 голосов
/ 20 февраля 2020

У меня есть изображения в папке 'images', названной так:

100.jpg
200.jpg
and on..

У меня есть лист Excel, в котором значения в первом (A) и втором (B) столбцах как таковые есть;

A    B
100  101
200  102
and on..

Я попытался написать небольшую программу, которая переименовывает файлы изображений, глядя в столбец A, и переименовывает его в столбец B.

Поэтому, как только программа запустится, моя папка изображений будет иметь изображения с именами. ; 101.jpg 102.jpg

Вот моя попытка;

var express = require('express');
var path = require('path');
var fs = require('fs');
var Excel = require('exceljs');

var app = express();
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(express.static(path.join(__dirname, 'public')));
app.disable('etag');
const testFolder = './images/';
var workbook = new Excel.Workbook(); 
var container;
var unprocfile;
var str;
var renamer;

var runner = 1;
fs.readdir(testFolder, (err, files) => {
  files.slice(1).forEach(file => {
      console.log('Entering foreach of files');
    unprocfile = file;
    str = unprocfile.substr(0, unprocfile.lastIndexOf("."));
    console.log('Name of the file' + str);
    workbook.xlsx.readFile('/Users/Mesam/Documents/renameimages/file.xlsx')
        .then(function() {
            var worksheet = workbook.getWorksheet('Sheet1');
            worksheet.eachRow( function(row, rowNumber) {
             container = row.values;
             // console.log(  typeof container);
             console.log('Entering foreach of Row');
             console.log('Value of 1st column' + row.values[1]);
             if (row.values[1] == str) {
                console.log('If name of file matched value of 1st column' + str + row.values[1]);
              renamer = row.values[2];
              console.log('Renamer var value '+ renamer);
              fs.rename('/Users/Mesam/Documents/renameimages/images/' + file, '/Users/Mesam/Documents/renameimages/images/' + renamer+ '.jpg', function(err, success){
                if (err){console.log(err)};
             });
             }
            });
        });
  })
});
// error handler
app.use(function(err, req, res, next) {
  // set locals, only providing error in development
  res.locals.message = err.message;
  res.locals.error = req.app.get('env') === 'development' ? err : {};


  // render the error page
  res.status(err.status || 500);
  res.render('error');
});

module.exports = app;

Вот результат работы консоли отладки;

Entering foreach of files
app.js:33
Name of the file100
app.js:36
Entering foreach of files
app.js:33
Name of the file200
app.js:36
Entering foreach of Row
app.js:43
Value of 1st column100
app.js:44
Entering foreach of Row
app.js:43
Value of 1st column200
app.js:44
If name of file matched value of 1st column200200
app.js:46
Renamer var value 202
app.js:48
Entering foreach of Row
app.js:43
Value of 1st column300
app.js:44
Entering foreach of Row
app.js:43
Value of 1st column100
app.js:44
Entering foreach of Row
app.js:43
Value of 1st column200
app.js:44
If name of file matched value of 1st column200200
app.js:46
Renamer var value 202
app.js:48
Entering foreach of Row
app.js:43
Value of 1st column300

Теперь идея для каждого файл, он должен l oop через все строки, которые он находит в Excel, сравнить значение столбца первой строки A, если он соответствует, переименовывает файл со значением столбца B.

Однако, консоль отладки показывает мне, что foreach из файлов выполняется без запуска внутреннего foreach из excel. Следовательно, на выходе программы остается только 1 изображение в моей папке с правильным именем 202.jpg.

EDIT1; Полезная информация; Я работаю над MA C, поэтому причина сращивания (1) - пропустить файл DS_Store. По умолчанию система создает этот скрытый файл.

Вывод console.log(file); сам по себе равен 100.jpg 200.jp g с splice(1)

Вывод console.log(row.values) равен

[Null, 100, 101]
[Null, 200, 202]

Не знаю, почему я получил Null, но код был написан так, чтобы его игнорировать. Отсюда row.values[1] ..

...