Python Forum
String Count - Printable Version

+- Python Forum (https://python-forum.io)
+-- Forum: Python Coding (https://python-forum.io/forum-7.html)
+--- Forum: General Coding Help (https://python-forum.io/forum-8.html)
+--- Thread: String Count (/thread-28503.html)



String Count - Kristenl2784 - Jul-21-2020

Hello,

Down where my code says Stop2 (close to the bottom) I'm trying to count how many times a string occurs inside a file. It's almost working correctly but my only problem is, is that it counts a similar string for instance the string is A118, and there's another string very similar to that inside the file called A118X. I don't want it to count A118X I just want it to count A118. I want it to count A118X on it's own. I have 1000's of strings to go through, each need to be counted individually.

import openpyxl as xl 
import os
import pandas as pd
import xlsxwriter
import xlrd
from xlsxwriter.utility import xl_rowcol_to_cell


input_dir = 'C:\\work\\comparison\\NNM'
Summary = 'C:\\work\\comparison\\Summary.xlsx'
Dwell = 'C:\\work\\comparison\\Dwell.xlsx'
newFile = 'C:\\work\\comparison\\Comparison.xlsx'




files = [file for file in os.listdir(input_dir)
         if os.path.isfile(file) and file.endswith(".xlsx")]

i=0

wb3=xlsxwriter.Workbook(newFile)
ws3=wb3.add_worksheet('Comparison')


format = wb3.add_format()
format.set_align('center')
format.set_align('vcenter')
format.set_bold(True)
format.set_font_size(14)
format.set_bg_color('#C9C9C9')
format.set_border(style=1)


for row_num in range(1,30):
    ws3.write_formula(row_num - 1, 5,
                            '=ABS(C%d - E%d)' % (row_num, row_num))
	

for row_num in range(1,30):
    ws3.write_formula(row_num - 1, 10,
                            '=ABS(H%d - J%d)' % (row_num, row_num))	
	
for row_num in range(1,30):
    ws3.write_formula(row_num - 1, 15,
                            '=ABS(N%d - O%d)' % (row_num, row_num))		
	

ws3.write_row("A1:Q1", ['TNAME','Start Segment','Start Chainage(ft)','Start Segment','Start Chainage(ft)','Start Chainage Difference(ft)','End Segment','End Chainage(ft)','End Segment','End Chainage(ft)','End Chainage Difference(ft)','Stops','Stops','Distance','Distance','Distance Difference (ft)','Comments'], format)
ws3.set_column(1, 17, 35)
wb3.close()

wb3 = xl.load_workbook(newFile) 
ws3 = wb3.worksheets[0]

wb2 = xl.load_workbook(Summary) 
ws2 = wb2.worksheets[1]


for file in files: 
   input_file =  os.path.join(input_dir, file)
   wb1=xl.load_workbook(input_file)
   ws1=wb1.worksheets[0]
   

   Stop1 = pd.read_excel(file,usecols = "F",squeeze = True)
   counts1 = Stop1.value_counts()
   z1 = counts1[0]/2
   
   Stop2 = pd.read_excel(Dwell,usecols = "A",squeeze = True)
   Detail=pd.read_excel(input_file, usecols="A",nrows=1,header=None,squeeze=True).str.slice(start=28,stop=-2).to_string(index=False).strip()
   counts2 = Stop2.str.match(Detail).sum()

   
   
   ws3[f'A{i+2}']=ws1['A1'].value[28:]
   ws3[f'D{i+2}']=ws1['B4'].value
   ws3[f'E{i+2}']=ws1['D4'].value
   ws3[f'I{i+2}']=ws1['B'][-1].value
   ws3[f'J{i+2}']=ws1['D'][-1].value
   ws3[f'O{i+2}']=ws1['E'][-1].value 
   ws3[f'N{i+2}']=ws2[f'I{i+6}'].value   
   ws3[f'M{i+2}']=z1
   ws3[f'L{i+2}']=counts2
  
   i += 1
  
   wb3.save(newFile)



RE: String Count - millpond - Jul-23-2020

While I am still too new to Python to give much assistance for correcting your code, I am familiar enough with regex to know that 'Match' means exactly that, and will return anything that contains the pattern specified.

I would use a regex with the \b pattern boundary.

In Perl I would use:
$mypattern =~ /\bA100\b/g;

The pattern is the same but the the syntax for python is a bit different, better explained in:
https://docs.python.org/3/howto/regex.html