2015-03-30 5 views
1

Приносим извинения за то, что вы новичок. У меня есть файлы TXT, которые сгенерированы в следующем стиле. Мне нужно иметь возможность конвертировать их в SpreadSheet, которые могут быть импортированы в базу данных.VBA Импорт текстового файла в Excel и Parse

": var1:" 
"NOM (LSL, USL) = 0.044 (0.035, 0.051)" 
"Subgroup" 1 2 3  
"Status" "" "" "" 
"X" 0.045 0.047 0.048  
"R" 0.009 0.008 0.003  
"s" 0.003 0.003 0.001  
"S1" 0.050 0.051 0.049  
"S2" 0.046 0.047 0.047  
"S3" 0.048 0.049 0.048  
"S4" 0.047 0.048 0.046  
"S5" 0.042 0.044 0.047  
"S6" 0.042 0.044 0.048  
"S7" 0.041 0.043 0.048  
"S8" 0.044 0.048 0.049  
"comments" " " " " " " 
"Inspector" "tb" "tb" "tb"  
"Machine" "shot1" "shot2" "shot3"  
"ID #" " " " " " " 
"Work Order" " " " " " "  
"Samples" " " " " " " " 
"Sample" " " " " " " " 
"Sample" " " " " " " " 
"Sample" " " " " " " " 
"Time" "23:05:04" "23:30:33" "02:15:40" 
"Date" "03/26/2015" "03/26/2015" "03/27/2015" 

": var2:" 
"NOM (LSL, USL) = 0.023 (0.020, 0.026)" 
"Subgroup" 1 2 3 
"Status" "" "" "" 
"X" 0.022 0.021 0.024  
"R" 0.003 0.002 0.003  
"s" 0.001 0.001 0.001  
"S1" 0.022 0.022 0.023 
"S2" 0.023 0.021 0.022 
"S3" 0.022 0.021 0.023 
"S4" 0.021 0.021 0.025 
"S5" 0.022 0.022 0.024 
"S6" 0.023 0.020 0.022 
"S7" 0.020 0.022 0.024 
"S8" 0.020 0.020 0.025 
"comments" " " " " " " 
"Inspector" "tb" "tb" "tb" 
"Machine" "shot1" "shot2" "shot3" 
"ID #" " " " " " "  
"Work Order" " " " " " " 
"Samples" " " " " " " 
"Sample" " " " " " " 
"Sample" " " " " " " 
"Sample" " " " " " " 
"Time" "23:05:04" "23:30:33" "02:15:40" 
"Date" "03/26/2015" "03/26/2015" "03/27/2015" 

": var3:" 
"NOM (LSL, USL) = 0.023 (0.020, 0.026)" 
"Subgroup" 1 2 3 
"Status" "" "" "" 
"X" 0.045 0.044 0.046 
"R" 0.004 0.005 0.007 
"s" 0.001 0.002 0.003 
"S1" 0.046 0.046 0.045 
"S2" 0.045 0.041 0.046 
"S3" 0.046 0.046 0.048 
"S4" 0.047 0.046 0.042 
"S5" 0.044 0.045 0.048 
"S6" 0.046 0.045 0.047 
"S7" 0.043 0.042 0.047 
"S8" 0.045 0.042 0.041 
"comments" " " " " " " 
"Inspector" "tb" "tb" "tb" 
"Machine" "shot1" "shot2" "shot3" 
"ID #" " " " " " " 
"Work Order" " " " " " " 
"Samples" " " " " " " 
"Sample" " " " " " " 
"Sample" " " " " " " 
"Sample" " " " " " " 
"Time" "23:05:04" "23:30:33" "02:15:40" 
"Date" "03/26/2015" "03/26/2015" "03/27/2015" 

Это всего лишь небольшой образец TXT, может быть больше S # и будет больше Var's. Хороший фрагмент данных можно отбросить, мне нужно всего лишь несколько вещей и отформатировать его. > Импортно> PARSE-> FORMAT

 : var1:  : var2:  : var3: 
NOM  0.044  0.023  0.023 
LSL  0.035  0.02  0.02 
USL  0.044  0.026  0.026 
S1  0.05  0.022  0.046 
S2  0.046  0.023  0.045 
S3  0.048  0.022  0.046 
S4  0.047  0.021  0.047 
S5  0.042  0.022  0.044 
S6  0.042  0.023  0.046 
S7  0.041  0.02  0.043 
S8  0.044  0.02  0.045 
S1  0.051  0.022  0.046 
S2  0.047  0.021  0.041 
S3  0.049  0.021  0.046 
S4  0.048  0.021  0.046 
S5  0.044  0.022  0.045 
S6  0.044  0.02  0.045 
S7  0.043  0.022  0.042 
S8  0.048  0.02  0.042 
S1  0.049  0.023  0.045 
S2  0.047  0.022  0.046 
S3  0.048  0.023  0.048 
S4  0.046  0.025  0.042 
S5  0.047  0.024  0.048 
S6  0.048  0.022  0.047 
S7  0.048  0.024  0.047 
S8  0.049  0.025  0.041 

Я знаю, как выполнить некоторые из этих вещей, но я не знаю, как объединить их в единый Sub, если это возможно. Для меня, стоящего, я должен заняться этим чем-то вроде этого.

Sub Import() 

    With ActiveSheet.QueryTables.Add(Connection:="TEXT;C:\Temp\HospiraWalls2.TXT" _ 
     , Destination:=Range("$A$1")) 
     .Name = "HospiraWalls2" 
     .FieldNames = True 
     .RowNumbers = False 
     .FillAdjacentFormulas = False 
     .PreserveFormatting = True 
     .RefreshOnFileOpen = False 
     .RefreshStyle = xlInsertDeleteCells 
     .SavePassword = False 
     .SaveData = True 
     .AdjustColumnWidth = True 
     .RefreshPeriod = 0 
     .TextFilePromptOnRefresh = False 
     .TextFilePlatform = 437 
     .TextFileStartRow = 1 
     .TextFileParseType = xlDelimited 
     .TextFileTextQualifier = xlTextQualifierDoubleQuote 
     .TextFileConsecutiveDelimiter = False 
     .TextFileTabDelimiter = True 
     .TextFileSemicolonDelimiter = False 
     .TextFileCommaDelimiter = False 
     .TextFileSpaceDelimiter = False 
     .TextFileColumnDataTypes = Array(1, 1, 1, 1, 1, 1) 
     .TextFileTrailingMinusNumbers = True 
     .Refresh BackgroundQuery:=False 
    End With 
    ActiveWindow.SmallScroll Down:=9 
End Sub 

разбор: Это я не знаю,

Sub OneColumn() 

Dim vIn  As Variant 
Dim vOut As Variant 
Dim i  As Long 
Dim j  As Long 
Dim ub1  As Long 
Dim ub2  As Long 

vIn = Application.Transpose(Range("B1").CurrentRegion) 
ub1 = UBound(vIn, 1) 
ub2 = UBound(vIn, 2) 
ReDim vOut(1 To ub1 * ub2, 1 To 1) 
For i = 1 To ub1 
    For j = 1 To ub2 
     vOut(j + (ub2 * (i - 1)), 1) = vIn(i, j) 
    Next j 
Next i 
Range("A1:A" & (ub1 * ub2)) = vOut 

End Sub 
+1

Что вы получаете при запуске 'Import()' Sub? Моя мысль заключалась бы в том, чтобы открыть его как текстовый файл и проанализировать его самостоятельно, поскольку форматирование настолько чувствительно к контексту. – FreeMan

+0

Я знаю, что скрипты, как у меня, теперь не сработают. Я ищу способ сделать это в одном скрипте, это то, что нужно делать 6-8 раз в неделю и занимает много времени, чтобы делать это на индивидуальной основе. –

+0

Итак, 'Imort()' полностью не проверен? Имеет смысл: '.QueryTables.Add()' предназначен для получения данных из базы данных, а не текстового файла, как случайным образом структурированного ... – FreeMan

ответ

1

Я думаю, что ваши данные в текстовом файле слишком неструктурированный использовать метод QueryTables().

У кого-то может быть лучший алгоритм для вас, но это будет мой подход. (Примечание: только псевдо-код)

Open the file 
MyLine = Read a line from the file 
While not EOF 
    'get your key for the line (the bit between " ") 
    Key = Mid(Myline, 2, InStr(2, MyLine, """")) 
    if left(key, 5) = ": var" then 
    Call NewVarSetupNewColumn 
    elseif left(key, 3) = "Nom" then 
    Call ParseNomLine 
    elseif left(key,1) = "S" and left(key,2) <> "Sa" then 'Get "Sx", but not "Sample" 
    Call ParseSxLine 
    elseif ... 
    'handle remaining lines you need, if you don't need the line, don't handle it 
    Read next line 
End While 

Вы можете поместить Call код в строке, но, сделав отдельные подпрограммы из этого, вы можете создавать и тестировать каждый из них по отдельности, игнорируя остальную часть файла. После того, как вы работаете, вы можете прокомментировать звонок, поэтому вам не нужно проходить его, пока вы отлаживаете следующий, просто чтобы сэкономить время. Кроме того, с большей частью кода в отдельных подписях будет намного легче читать.